Browse Source

1、初始化

yys 3 weeks ago
parent
commit
3643352bd9
100 changed files with 8178 additions and 1037 deletions
  1. 75 8
      public/chat-aggregate.html
  2. 44 0
      src/api/commissionRecord.js
  3. 44 0
      src/api/company/companyVoice.js
  4. 44 0
      src/api/company/companyVoiceBlacklist.js
  5. 44 0
      src/api/company/companyVoiceConfig.js
  6. 44 0
      src/api/company/companyVoicePackage.js
  7. 44 0
      src/api/consumeRecord.js
  8. 2 2
      src/api/crm/customer.js
  9. 44 0
      src/api/rechargeRecord.js
  10. 44 0
      src/api/withdrawalManage.js
  11. 1 3
      src/layout/components/Sidebar/Item.vue
  12. 42 33
      src/router/index.js
  13. 20 0
      src/store/modules/permission.js
  14. 98 19
      src/views/FastGptExtUserTag/index/index.vue
  15. 98 19
      src/views/ad/adDyApi/index/index.vue
  16. 98 19
      src/views/ad/clickLog/index/index.vue
  17. 94 0
      src/views/admin/ad/index.vue
  18. 93 0
      src/views/admin/aiProvider/index.vue
  19. 93 0
      src/views/admin/article/index.vue
  20. 94 0
      src/views/admin/callRecord/index.vue
  21. 89 0
      src/views/admin/commissionRecord/index.vue
  22. 89 0
      src/views/admin/consumeRecord/index.vue
  23. 93 0
      src/views/admin/course/index.vue
  24. 93 0
      src/views/admin/crm/index.vue
  25. 93 0
      src/views/admin/live/index.vue
  26. 93 0
      src/views/admin/liveVideo/index.vue
  27. 93 0
      src/views/admin/moduleUsage/index.vue
  28. 94 0
      src/views/admin/product/index.vue
  29. 92 0
      src/views/admin/proxy/index.vue
  30. 93 0
      src/views/admin/qwExternalContact/index.vue
  31. 89 0
      src/views/admin/rechargeRecord/index.vue
  32. 93 0
      src/views/admin/sop/index.vue
  33. 95 0
      src/views/admin/storeOrder/index.vue
  34. 93 0
      src/views/admin/sysCompany/index.vue
  35. 94 0
      src/views/admin/sysUser/index.vue
  36. 93 0
      src/views/admin/videoResource/index.vue
  37. 95 0
      src/views/admin/withdrawalManage/index.vue
  38. 101 22
      src/views/callRecord/index/index.vue
  39. 10 0
      src/views/company/aiModel/inboundCallManage/inboundCallRecord.vue
  40. 10 0
      src/views/company/aiModel/inboundCallManage/index.vue
  41. 94 0
      src/views/company/companyVoice/index.vue
  42. 93 0
      src/views/company/companyVoiceBlacklist/index.vue
  43. 93 0
      src/views/company/companyVoiceConfig/index.vue
  44. 93 0
      src/views/company/companyVoicePackage/index.vue
  45. 10 0
      src/views/company/companyWorkflowManage/index.vue
  46. 172 0
      src/views/course/course.vue
  47. 98 19
      src/views/course/courseAnswerLog/index/index.vue
  48. 98 19
      src/views/course/courseQuestionCategory/index/index.vue
  49. 98 19
      src/views/course/index/index.vue
  50. 98 19
      src/views/course/period/index/index.vue
  51. 98 19
      src/views/course/playSourceConfig/index/index.vue
  52. 98 19
      src/views/course/sopLogs/index/index.vue
  53. 98 19
      src/views/course/trainingCamp/index/index.vue
  54. 98 19
      src/views/course/userCourseCommentLike/index/index.vue
  55. 98 19
      src/views/course/userCourseFavorite/index/index.vue
  56. 98 19
      src/views/course/userCourseNoteLike/index/index.vue
  57. 98 19
      src/views/course/userCourseVideo/index/index.vue
  58. 98 19
      src/views/course/userTalentFollow/index/index.vue
  59. 98 19
      src/views/course/userVideoCommentLike/index/index.vue
  60. 98 19
      src/views/course/userVideoFavorite/index/index.vue
  61. 98 19
      src/views/course/userVideoLike/index/index.vue
  62. 98 19
      src/views/course/userVideoView/index/index.vue
  63. 98 19
      src/views/course/videoTags/index/index.vue
  64. 98 19
      src/views/courseFinishTemp/course/index/index.vue
  65. 10 0
      src/views/crm/customerAiChat/index.vue
  66. 98 19
      src/views/crm/customerAssign/index/index.vue
  67. 10 0
      src/views/crm/customerBusiness/index.vue
  68. 10 0
      src/views/crm/customerBusiness/my.vue
  69. 98 19
      src/views/crm/customerLevel/index/index.vue
  70. 98 19
      src/views/fastGpt/fastGptChatReplaceText/index/index.vue
  71. 10 0
      src/views/fastGpt/redPack/redPackage.vue
  72. 98 19
      src/views/his/FsFollowReport/index/index.vue
  73. 98 19
      src/views/his/city/index/index.vue
  74. 98 19
      src/views/his/doctor/index/index.vue
  75. 98 19
      src/views/his/doctorBill/index/index.vue
  76. 98 19
      src/views/his/doctorExtract/index/index.vue
  77. 98 19
      src/views/his/doctorOperLog/index/index.vue
  78. 98 19
      src/views/his/doctorProduct/index/index.vue
  79. 98 19
      src/views/his/healthArticle/index/index.vue
  80. 98 19
      src/views/his/logs/index/index.vue
  81. 98 19
      src/views/his/packageFavorite/index/index.vue
  82. 98 19
      src/views/his/pharmacist/index/index.vue
  83. 98 19
      src/views/his/price/index/index.vue
  84. 98 19
      src/views/his/promotionActive/index/index.vue
  85. 98 19
      src/views/his/promotionActiveLog/index/index.vue
  86. 98 19
      src/views/his/storeAfterSales/index/index.vue
  87. 98 19
      src/views/his/storeBill/index/index.vue
  88. 98 19
      src/views/his/storeExtract/index/index.vue
  89. 98 19
      src/views/his/storeLog/index/index.vue
  90. 98 19
      src/views/his/template/index/index.vue
  91. 98 19
      src/views/his/userAddress/index/index.vue
  92. 98 19
      src/views/his/userBill/index/index.vue
  93. 98 19
      src/views/his/userExtract/index/index.vue
  94. 98 19
      src/views/his/userNewTask/index/index.vue
  95. 98 19
      src/views/his/userOperationLog/index/index.vue
  96. 12 0
      src/views/hisStore/storeOrder/storeList.vue
  97. 12 0
      src/views/hisStore/storeRedundSales/index.vue
  98. 98 19
      src/views/live/healthLiveOrder/index/index.vue
  99. 98 19
      src/views/live/index/index.vue
  100. 98 19
      src/views/live/issue/index/index.vue

+ 75 - 8
public/chat-aggregate.html

@@ -240,18 +240,85 @@ const {createApp, ref, computed, watch, nextTick, onMounted} = Vue;
             const messageList = ref(null);
             const loading = ref(false);
             
-            // API请求工具函数
+            // ====== API配置 ======
+            // 从URL参数获取配置(iframe嵌入时由父窗口传递)
+            const getUrlParam = (name) => {
+                const params = new URLSearchParams(window.location.search);
+                return params.get(name) || '';
+            };
+            
+            // 获取API基路径:URL参数 > 父窗口webpack环境变量 > 默认值
+            const getBaseApi = () => {
+                const fromUrl = getUrlParam('baseApi');
+                if (fromUrl) return fromUrl;
+                try {
+                    if (window.parent && window.parent.process && window.parent.process.env) {
+                        return window.parent.process.env.VUE_APP_BASE_API || '/dev-api';
+                    }
+                } catch(e) {}
+                return '/dev-api';
+            };
+            const BASE_API = getBaseApi();
+            
+            // 获取前端类型:URL参数 > 默认值
+            const getFrontendType = () => {
+                return getUrlParam('frontendType') || 'company';
+            };
+            const FRONTEND_TYPE = getFrontendType();
+            
+            // 从Cookie获取Token
+            const getToken = () => {
+                const match = document.cookie.match(/(?:^|;\s*)Web-Token=([^;]*)/);
+                return match ? match[1] : null;
+            };
+            
+            // 获取租户编码:URL参数 > localStorage
+            const getTenantCode = () => {
+                const fromUrl = getUrlParam('tenantCode');
+                if (fromUrl) return fromUrl;
+                try {
+                    return localStorage.getItem('tenantCode') || '';
+                } catch(e) { return ''; }
+            };
+            
+            // 认证请求工具
             const request = async (url, options = {}) => {
-                const defaultOptions = {
-                    headers: {
-                        'Content-Type': 'application/json',
-                    },
+                const token = getToken();
+                const tenantCode = getTenantCode();
+                const headers = {
+                    'Content-Type': 'application/json',
+                    'X-Frontend-Type': FRONTEND_TYPE,
                 };
-                const response = await fetch(url, { ...defaultOptions, ...options });
+                if (token) {
+                    headers['Authorization'] = 'Bearer ' + token;
+                }
+                if (tenantCode) {
+                    headers['tenant-code'] = tenantCode;
+                }
+                // 合并自定义headers
+                if (options.headers) {
+                    Object.assign(headers, options.headers);
+                }
+                
+                const fullUrl = url.startsWith('http') ? url : (BASE_API + url);
+                const response = await fetch(fullUrl, {
+                    ...options,
+                    headers,
+                    credentials: 'include',
+                });
                 if (!response.ok) {
-                    throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+                    const text = await response.text().catch(() => '');
+                    throw new Error(`HTTP ${response.status}: ${text || response.statusText}`);
+                }
+                const data = await response.json();
+                if (data.code === 401) {
+                    // Token过期,通知父窗口刷新
+                    if (window.parent && window.parent.location) {
+                        window.parent.location.reload();
+                    }
+                    throw new Error('登录已过期');
                 }
-                return await response.json();
+                return data;
             };
 
             // 账户列表

+ 44 - 0
src/api/commissionRecord.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询返佣记录列表
+export function listApi(query) {
+  return request({
+    url: '/commissionRecord/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询返佣记录详细
+export function getApi(id) {
+  return request({
+    url: '/commissionRecord/' + id,
+    method: 'get'
+  })
+}
+
+// 新增返佣记录
+export function addApi(data) {
+  return request({
+    url: '/commissionRecord',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改返佣记录
+export function updateApi(data) {
+  return request({
+    url: '/commissionRecord',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除返佣记录
+export function delApi(id) {
+  return request({
+    url: '/commissionRecord/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
src/api/company/companyVoice.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询通话管理列表
+export function listApi(query) {
+  return request({
+    url: '/company/companyVoice/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询通话管理详细
+export function getApi(id) {
+  return request({
+    url: '/company/companyVoice/' + id,
+    method: 'get'
+  })
+}
+
+// 新增通话管理
+export function addApi(data) {
+  return request({
+    url: '/company/companyVoice',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改通话管理
+export function updateApi(data) {
+  return request({
+    url: '/company/companyVoice',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除通话管理
+export function delApi(id) {
+  return request({
+    url: '/company/companyVoice/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
src/api/company/companyVoiceBlacklist.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询黑名单管理列表
+export function listApi(query) {
+  return request({
+    url: '/company/companyVoiceBlacklist/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询黑名单管理详细
+export function getApi(id) {
+  return request({
+    url: '/company/companyVoiceBlacklist/' + id,
+    method: 'get'
+  })
+}
+
+// 新增黑名单管理
+export function addApi(data) {
+  return request({
+    url: '/company/companyVoiceBlacklist',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改黑名单管理
+export function updateApi(data) {
+  return request({
+    url: '/company/companyVoiceBlacklist',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除黑名单管理
+export function delApi(id) {
+  return request({
+    url: '/company/companyVoiceBlacklist/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
src/api/company/companyVoiceConfig.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询呼叫频率配置列表
+export function listApi(query) {
+  return request({
+    url: '/company/companyVoiceConfig/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询呼叫频率配置详细
+export function getApi(id) {
+  return request({
+    url: '/company/companyVoiceConfig/' + id,
+    method: 'get'
+  })
+}
+
+// 新增呼叫频率配置
+export function addApi(data) {
+  return request({
+    url: '/company/companyVoiceConfig',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改呼叫频率配置
+export function updateApi(data) {
+  return request({
+    url: '/company/companyVoiceConfig',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除呼叫频率配置
+export function delApi(id) {
+  return request({
+    url: '/company/companyVoiceConfig/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
src/api/company/companyVoicePackage.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询通话套餐管理列表
+export function listApi(query) {
+  return request({
+    url: '/company/companyVoicePackage/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询通话套餐管理详细
+export function getApi(id) {
+  return request({
+    url: '/company/companyVoicePackage/' + id,
+    method: 'get'
+  })
+}
+
+// 新增通话套餐管理
+export function addApi(data) {
+  return request({
+    url: '/company/companyVoicePackage',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改通话套餐管理
+export function updateApi(data) {
+  return request({
+    url: '/company/companyVoicePackage',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除通话套餐管理
+export function delApi(id) {
+  return request({
+    url: '/company/companyVoicePackage/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
src/api/consumeRecord.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询消费扣款记录列表
+export function listApi(query) {
+  return request({
+    url: '/consumeRecord/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询消费扣款记录详细
+export function getApi(id) {
+  return request({
+    url: '/consumeRecord/' + id,
+    method: 'get'
+  })
+}
+
+// 新增消费扣款记录
+export function addApi(data) {
+  return request({
+    url: '/consumeRecord',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改消费扣款记录
+export function updateApi(data) {
+  return request({
+    url: '/consumeRecord',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除消费扣款记录
+export function delApi(id) {
+  return request({
+    url: '/consumeRecord/' + id,
+    method: 'delete'
+  })
+}

+ 2 - 2
src/api/crm/customer.js

@@ -129,7 +129,7 @@ export function getCustomer(customerId) {
 
 export function addCustomer(data) {
   return request({
-    url: '/crm/customer',
+    url: '/crm/customer/addCrm',
     method: 'post',
     data: data
   })
@@ -138,7 +138,7 @@ export function addCustomer(data) {
 // 修改客户
 export function updateCustomer(data) {
   return request({
-    url: '/crm/customer',
+    url: '/crm/customer/editCrm',
     method: 'put',
     data: data
   })

+ 44 - 0
src/api/rechargeRecord.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询充值记录列表
+export function listApi(query) {
+  return request({
+    url: '/rechargeRecord/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询充值记录详细
+export function getApi(id) {
+  return request({
+    url: '/rechargeRecord/' + id,
+    method: 'get'
+  })
+}
+
+// 新增充值记录
+export function addApi(data) {
+  return request({
+    url: '/rechargeRecord',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改充值记录
+export function updateApi(data) {
+  return request({
+    url: '/rechargeRecord',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除充值记录
+export function delApi(id) {
+  return request({
+    url: '/rechargeRecord/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
src/api/withdrawalManage.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询提现管理列表
+export function listApi(query) {
+  return request({
+    url: '/withdrawalManage/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询提现管理详细
+export function getApi(id) {
+  return request({
+    url: '/withdrawalManage/' + id,
+    method: 'get'
+  })
+}
+
+// 新增提现管理
+export function addApi(data) {
+  return request({
+    url: '/withdrawalManage',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改提现管理
+export function updateApi(data) {
+  return request({
+    url: '/withdrawalManage',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除提现管理
+export function delApi(id) {
+  return request({
+    url: '/withdrawalManage/' + id,
+    method: 'delete'
+  })
+}

+ 1 - 3
src/layout/components/Sidebar/Item.vue

@@ -16,9 +16,7 @@ export default {
     const { icon, title } = context.props
     const vnodes = []
 
-    if (icon) {
-      vnodes.push(<svg-icon icon-class={icon}/>)
-    }
+    vnodes.push(<svg-icon icon-class={icon || 'tree-table'}/>)
 
     if (title) {
       vnodes.push(<span slot='title'>{(title)}</span>)

+ 42 - 33
src/router/index.js

@@ -525,87 +525,96 @@ export const constantRoutes = [
   {
     path: '/lobster',
     component: Layout,
-    redirect: '/lobster/workflow-generate',
+    redirect: '/lobster/production-workflow',
     name: 'Lobster',
-    meta: { title: '龙虾引擎', icon: 'el-icon-cpu' },
-    children: [
+    meta: { title: '龙虾引擎', icon: 'system' },
+    children: [
+      {
+        path: 'production-workflow',
+        component: ParentView,
+        redirect: '/lobster/production-workflow/canvas',
+        name: 'ProductionWorkflow',
+        meta: { title: 'AI生产工作流', icon: 'component' },
+        children: [
+          {
+            path: 'canvas',
+            component: () => import('@/views/lobster/workflow-canvas/index'),
+            name: 'LobsterCanvas',
+            meta: { title: '工作流画布', icon: 'chart' }
+          },
+          {
+            path: 'template',
+            component: () => import('@/views/lobster/template/index'),
+            name: 'LobsterTemplate',
+            meta: { title: '工作流模板库', icon: 'documentation' }
+          }
+        ]
+      },
       {
         path: 'workflow-generate',
         component: () => import('@/views/lobster/workflow-generate/index'),
         name: 'LobsterGenerate',
-        meta: { title: 'AI生成工作流', icon: 'el-icon-magic-stick' }
-      },
-      {
-        path: 'workflow-canvas',
-        component: () => import('@/views/lobster/workflow-canvas/index'),
-        name: 'LobsterCanvas',
-        meta: { title: '工作流画布', icon: 'el-icon-share' }
-      },
-      {
-        path: 'template',
-        component: () => import('@/views/lobster/template/index'),
-        name: 'LobsterTemplate',
-        meta: { title: '工作流模板库', icon: 'el-icon-document' }
+        meta: { title: 'AI生成工作流', icon: 'build' }
       },
       {
         path: 'instance',
         component: () => import('@/views/lobster/instance/index'),
         name: 'LobsterInstance',
-        meta: { title: '实例监控', icon: 'el-icon-monitor' }
+        meta: { title: '实例监控', icon: 'monitor' }
       },
       {
         path: 'optimization',
         component: () => import('@/views/lobster/optimization/index'),
         name: 'LobsterOptimization',
-        meta: { title: 'AI优化建议', icon: 'el-icon-lightbulb' }
+        meta: { title: 'AI优化建议', icon: 'eye-open' }
       },
       {
         path: 'prompt',
         component: () => import('@/views/lobster/prompt/index'),
         name: 'LobsterPrompt',
-        meta: { title: '提示词管理', icon: 'el-icon-edit-outline' }
+        meta: { title: '提示词管理', icon: 'edit' }
       },
       {
         path: 'sales-corpus',
         component: () => import('@/views/lobster/sales-corpus/index'),
         name: 'SalesCorpus',
-        meta: { title: '销冠语料学习', icon: 'el-icon-star-on' }
+        meta: { title: '销冠语料学习', icon: 'star' }
       },
       {
         path: 'api-registry',
         component: () => import('@/views/lobster/api-registry/index'),
         name: 'LobsterApiRegistry',
-        meta: { title: '接口注册中心', icon: 'el-icon-connection' }
+        meta: { title: '接口注册中心', icon: 'nested' }
       },
       {
         path: 'dead-letter',
         component: () => import('@/views/lobster/dead-letter/index'),
         name: 'LobsterDeadLetter',
-        meta: { title: '死信队列', icon: 'el-icon-warning-outline' }
+        meta: { title: '死信队列', icon: 'bug' }
       },
       {
         path: 'event-audit',
         component: () => import('@/views/lobster/event-audit/index'),
         name: 'LobsterEventAudit',
-        meta: { title: '节点审核', icon: 'el-icon-check' }
+        meta: { title: '节点审核', icon: 'checkbox' }
       },
       {
         path: 'chat-aggregate',
         component: () => import('@/views/lobster/chat-aggregate/index'),
         name: 'ChatAggregate',
-        meta: { title: '聚合聊天', icon: 'el-icon-chat-dot-round' }
+        meta: { title: '聚合聊天', icon: 'message' }
       },
       {
         path: 'model-config',
         component: () => import('@/views/lobster/model-config/index'),
         name: 'LobsterModelConfig',
-        meta: { title: '模型配置', icon: 'el-icon-cpu' }
+        meta: { title: '模型配置', icon: 'server' }
       },
       {
         path: 'billing',
         component: () => import('@/views/lobster/billing/index'),
         name: 'LobsterBilling',
-        meta: { title: 'Token系数管理', icon: 'el-icon-money' }
+        meta: { title: 'Token系数管理', icon: 'money' }
       }
     ]
   },
@@ -614,7 +623,7 @@ export const constantRoutes = [
   {
     path: '/crm',
     component: Layout, redirect: '/crm/customer', name: 'Crm',
-    meta: { title: 'CRM', icon: 'el-icon-s-custom' },
+    meta: { title: 'CRM', icon: 'crm' },
     children: [
       { path: 'customer', component: () => import('@/views/crm/customer/index'), name: 'CrmCustomer', meta: { title: '客户管理' } },
       { path: 'event', component: () => import('@/views/crm/event/index'), name: 'CrmEvent', meta: { title: '客户事件' } },
@@ -627,7 +636,7 @@ export const constantRoutes = [
   {
     path: '/chat',
     component: Layout, redirect: '/chat/chatSession', name: 'Chat',
-    meta: { title: 'AI聊天', icon: 'el-icon-chat-dot-round' },
+    meta: { title: 'AI聊天', icon: 'message' },
     children: [
       { path: 'chatSession', component: () => import('@/views/chat/chatSession/index'), name: 'ChatSession', meta: { title: '会话列表' } },
       { path: 'chatRole', component: () => import('@/views/chat/chatRole/index'), name: 'ChatRole', meta: { title: 'AI角色' } },
@@ -639,7 +648,7 @@ export const constantRoutes = [
   {
     path: '/fastGpt',
     component: Layout, redirect: '/fastGpt/fastGptRole', name: 'FastGpt',
-    meta: { title: 'FastGpt', icon: 'el-icon-cpu' },
+    meta: { title: 'FastGpt', icon: 'server' },
     children: [
       { path: 'fastGptRole', component: () => import('@/views/fastGpt/fastGptRole/index'), name: 'FastGptRole', meta: { title: '角色管理' } },
       { path: 'fastGptDataset', component: () => import('@/views/fastGpt/fastGptDataset/index'), name: 'FastGptData', meta: { title: '数据集', hidden: true } },
@@ -651,7 +660,7 @@ export const constantRoutes = [
   {
     path: '/company',
     component: Layout, redirect: '/company/companyUser', name: 'Company',
-    meta: { title: '企业管理', icon: 'el-icon-office-building' },
+    meta: { title: '企业管理', icon: 'people' },
     children: [
       { path: 'companyUser', component: () => import('@/views/company/companyUser/index'), name: 'CompUser', meta: { title: '员工管理' } },
       { path: 'companyRole', component: () => import('@/views/company/companyRole/index'), name: 'CompRole', meta: { title: '角色管理', hidden: true } },
@@ -670,7 +679,7 @@ export const constantRoutes = [
   {
     path: '/companyWx',
     component: Layout, redirect: '/companyWx/companyWorkflow', name: 'CompanyWx',
-    meta: { title: '企微管理', icon: 'el-icon-s-platform' },
+    meta: { title: '企微管理', icon: 'wechat' },
     children: [
       { path: 'companyWorkflow', component: () => import('@/views/company/companyWorkflow/index'), name: 'CompWorkflow', meta: { title: 'AI外呼工作流' } }
     ]
@@ -680,7 +689,7 @@ export const constantRoutes = [
   {
     path: '/wx',
     component: Layout, redirect: '/wx/wxAccount', name: 'Wx',
-    meta: { title: '个微管理', icon: 'el-icon-chat-line-square' },
+    meta: { title: '个微管理', icon: 'user' },
     children: [
       { path: 'wxAccount', component: () => import('@/views/company/wxAccount/index'), name: 'WxAccount', meta: { title: '个微账号' } },
       { path: 'wxUser', component: () => import('@/views/company/wxUser/index'), name: 'WxUser', meta: { title: '个微用户', hidden: true } }
@@ -691,7 +700,7 @@ export const constantRoutes = [
   {
     path: '/store',
     component: Layout, redirect: '/store/storeProduct', name: 'Store',
-    meta: { title: '商城管理', icon: 'el-icon-shopping-cart-2' },
+    meta: { title: '商城管理', icon: 'shopping' },
     children: [
       { path: 'storeProduct', component: () => import('@/views/store/storeProduct/index'), name: 'StoreProduct', meta: { title: '商品管理' } },
       { path: 'storeOrder', component: () => import('@/views/store/storeOrder/list'), name: 'StoreOrder', meta: { title: '订单管理', hidden: true } },

+ 20 - 0
src/store/modules/permission.js

@@ -55,6 +55,9 @@ const permission = {
               route.path = '/' + route.path;
             }
           });
+          // 修复:消除重复路由name,避免Vue Router重复键警告
+          deduplicateRouteNames(rewriteRoutes)
+          deduplicateRouteNames(sidebarRoutes)
           rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true })
           commit('SET_ROUTES', rewriteRoutes)
           commit('SET_SIDEBAR_ROUTERS', constantRoutes.concat(sidebarRoutes))
@@ -95,6 +98,23 @@ function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
   })
 }
 
+// 递归消除重复路由name,为重复的name追加后缀
+function deduplicateRouteNames(routes, nameSet = new Set()) {
+  routes.forEach(route => {
+    if (route.name) {
+      if (nameSet.has(route.name)) {
+        // 重复name:追加路径后缀使其唯一
+        const suffix = route.path ? '_' + route.path.replace(/[\/\\]/g, '_') : '_' + Date.now()
+        route.name = route.name + suffix
+      }
+      nameSet.add(route.name)
+    }
+    if (route.children && route.children.length) {
+      deduplicateRouteNames(route.children, nameSet)
+    }
+  })
+}
+
 function filterChildren(childrenMap, lastRouter = false) {
   var children = []
   childrenMap.forEach((el, index) => {

+ 98 - 19
src/views/FastGptExtUserTag/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['FastGptExtUserTag:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['FastGptExtUserTag:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['FastGptExtUserTag:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "Fastgptextusertag",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/FastGptExtUserTag/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/FastGptExtUserTag/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/FastGptExtUserTag", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/FastGptExtUserTag", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/FastGptExtUserTag/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/ad/adDyApi/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['ad:adDyApi:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['ad:adDyApi:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['ad:adDyApi:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "AdAddyapi",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/ad/adDyApi/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/ad/adDyApi/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/ad/adDyApi", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/ad/adDyApi", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/ad/adDyApi/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/ad/clickLog/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['ad:clickLog:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['ad:clickLog:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['ad:clickLog:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "AdClicklog",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/ad/clickLog/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/ad/clickLog/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/ad/clickLog", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/ad/clickLog", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/ad/clickLog/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 94 - 0
src/views/admin/ad/index.vue

@@ -0,0 +1,94 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="广告名称" align="center" prop="adName" />
+      <el-table-column label="广告类型" align="center" prop="adType" width="100" />
+      <el-table-column label="投放平台" align="center" prop="platform" width="100" />
+      <el-table-column label="点击量" align="center" prop="clickCount" width="80" />
+      <el-table-column label="状态" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'success':'danger'" size="small">{{ scope.row.status==='0'?'投放中':'已停止' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:ad:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:ad:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/ad'
+
+export default {
+  name: 'Ad',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 93 - 0
src/views/admin/aiProvider/index.vue

@@ -0,0 +1,93 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="模型名称" align="center" prop="providerName" />
+      <el-table-column label="模型类型" align="center" prop="modelType" width="120" />
+      <el-table-column label="API地址" align="center" prop="apiUrl" />
+      <el-table-column label="状态" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'success':'danger'" size="small">{{ scope.row.status==='0'?'正常':'停用' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:aiProvider:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:aiProvider:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/aiProvider'
+
+export default {
+  name: 'AiProvider',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 93 - 0
src/views/admin/article/index.vue

@@ -0,0 +1,93 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="文章标题" align="center" prop="title" />
+      <el-table-column label="文章分类" align="center" prop="categoryName" width="120" />
+      <el-table-column label="作者" align="center" prop="author" width="100" />
+      <el-table-column label="状态" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'success':'danger'" size="small">{{ scope.row.status==='0'?'已发布':'草稿' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:article:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:article:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/article'
+
+export default {
+  name: 'Article',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 94 - 0
src/views/admin/callRecord/index.vue

@@ -0,0 +1,94 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="通话类型" align="center" prop="callType" width="100" />
+      <el-table-column label="主叫号码" align="center" prop="callerNumber" width="120" />
+      <el-table-column label="被叫号码" align="center" prop="calleeNumber" width="120" />
+      <el-table-column label="通话时长(秒)" align="center" prop="duration" width="110" />
+      <el-table-column label="状态" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'success':'danger'" size="small">{{ scope.row.status==='0'?'正常':'异常' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:callRecord:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:callRecord:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/callRecord'
+
+export default {
+  name: 'CallRecord',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 89 - 0
src/views/admin/commissionRecord/index.vue

@@ -0,0 +1,89 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="返佣类型" align="center" prop="commissionType" width="120" />
+      <el-table-column label="返佣金额" align="center" prop="amount" width="120" />
+      <el-table-column label="来源" align="center" prop="source" />
+      <el-table-column label="描述" align="center" prop="description" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:commissionRecord:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:commissionRecord:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/commissionRecord'
+
+export default {
+  name: 'CommissionRecord',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 89 - 0
src/views/admin/consumeRecord/index.vue

@@ -0,0 +1,89 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="消费类型" align="center" prop="consumeType" width="120" />
+      <el-table-column label="消费金额" align="center" prop="amount" width="120" />
+      <el-table-column label="余额" align="center" prop="balance" width="120" />
+      <el-table-column label="描述" align="center" prop="description" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:consumeRecord:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:consumeRecord:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/consumeRecord'
+
+export default {
+  name: 'ConsumeRecord',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 93 - 0
src/views/admin/course/index.vue

@@ -0,0 +1,93 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="课程名称" align="center" prop="courseName" />
+      <el-table-column label="课程类型" align="center" prop="courseType" width="100" />
+      <el-table-column label="讲师" align="center" prop="teacher" width="100" />
+      <el-table-column label="状态" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'success':'danger'" size="small">{{ scope.row.status==='0'?'上架':'下架' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:course:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:course:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/course'
+
+export default {
+  name: 'Course',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 93 - 0
src/views/admin/crm/index.vue

@@ -0,0 +1,93 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="语料名称" align="center" prop="name" />
+      <el-table-column label="语料类型" align="center" prop="type" width="100" />
+      <el-table-column label="学习次数" align="center" prop="learnCount" width="100" />
+      <el-table-column label="状态" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'success':'danger'" size="small">{{ scope.row.status==='0'?'正常':'停用' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:crm:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:crm:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/crm'
+
+export default {
+  name: 'Crm',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 93 - 0
src/views/admin/live/index.vue

@@ -0,0 +1,93 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="直播间名称" align="center" prop="liveName" />
+      <el-table-column label="直播类型" align="center" prop="liveType" width="100" />
+      <el-table-column label="主播" align="center" prop="anchorName" width="100" />
+      <el-table-column label="状态" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'success':'danger'" size="small">{{ scope.row.status==='0'?'直播中':'已结束' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:live:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:live:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/live'
+
+export default {
+  name: 'Live',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 93 - 0
src/views/admin/liveVideo/index.vue

@@ -0,0 +1,93 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="视频名称" align="center" prop="videoName" />
+      <el-table-column label="直播间" align="center" prop="liveName" width="120" />
+      <el-table-column label="视频时长" align="center" prop="duration" width="100" />
+      <el-table-column label="状态" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'success':'danger'" size="small">{{ scope.row.status==='0'?'正常':'异常' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:liveVideo:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:liveVideo:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listLiveVideo, delLiveVideo } from '@/api/live/liveVideo'
+
+export default {
+  name: 'LiveVideo',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listLiveVideo(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delLiveVideo(row.id || row.videoId)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 93 - 0
src/views/admin/moduleUsage/index.vue

@@ -0,0 +1,93 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="模块名称" align="center" prop="moduleName" />
+      <el-table-column label="用量" align="center" prop="usageCount" width="100" />
+      <el-table-column label="配额" align="center" prop="quota" width="100" />
+      <el-table-column label="用量占比" align="center" prop="usageRate" width="100">
+        <template slot-scope="scope">
+          <el-progress :percentage="scope.row.usageRate || 0" :stroke-width="6" style="width:80px" />
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:moduleUsage:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:moduleUsage:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/moduleUsage'
+
+export default {
+  name: 'ModuleUsage',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 94 - 0
src/views/admin/product/index.vue

@@ -0,0 +1,94 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="商品名称" align="center" prop="productName" />
+      <el-table-column label="商品分类" align="center" prop="categoryName" width="120" />
+      <el-table-column label="价格" align="center" prop="price" width="100" />
+      <el-table-column label="库存" align="center" prop="stock" width="80" />
+      <el-table-column label="状态" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'success':'danger'" size="small">{{ scope.row.status==='0'?'上架':'下架' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:product:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:product:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/product'
+
+export default {
+  name: 'Product',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 92 - 0
src/views/admin/proxy/index.vue

@@ -0,0 +1,92 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="代理名称" align="center" prop="proxyName" />
+      <el-table-column label="联系电话" align="center" prop="phone" width="120" />
+      <el-table-column label="状态" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'success':'danger'" size="small">{{ scope.row.status==='0'?'正常':'停用' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:proxy:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:proxy:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/proxy'
+
+export default {
+  name: 'ProxyManage',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 93 - 0
src/views/admin/qwExternalContact/index.vue

@@ -0,0 +1,93 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="用户名称" align="center" prop="name" />
+      <el-table-column label="手机号" align="center" prop="phone" width="120" />
+      <el-table-column label="来源" align="center" prop="source" width="100" />
+      <el-table-column label="状态" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'success':'danger'" size="small">{{ scope.row.status==='0'?'正常':'停用' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:qwExternalContact:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:qwExternalContact:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/qwExternalContact'
+
+export default {
+  name: 'QwExternalContact',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 89 - 0
src/views/admin/rechargeRecord/index.vue

@@ -0,0 +1,89 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="充值方式" align="center" prop="rechargeType" width="120" />
+      <el-table-column label="充值金额" align="center" prop="amount" width="120" />
+      <el-table-column label="余额" align="center" prop="balance" width="120" />
+      <el-table-column label="描述" align="center" prop="description" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:rechargeRecord:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:rechargeRecord:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/rechargeRecord'
+
+export default {
+  name: 'RechargeRecord',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 93 - 0
src/views/admin/sop/index.vue

@@ -0,0 +1,93 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="SOP名称" align="center" prop="sopName" />
+      <el-table-column label="触发类型" align="center" prop="triggerType" width="100" />
+      <el-table-column label="执行次数" align="center" prop="execCount" width="100" />
+      <el-table-column label="状态" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'success':'danger'" size="small">{{ scope.row.status==='0'?'启用':'停用' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:sop:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:sop:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/sop'
+
+export default {
+  name: 'Sop',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 95 - 0
src/views/admin/storeOrder/index.vue

@@ -0,0 +1,95 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="订单编号" align="center" prop="orderNo" width="180" />
+      <el-table-column label="商品名称" align="center" prop="productName" />
+      <el-table-column label="金额" align="center" prop="amount" width="100" />
+      <el-table-column label="订单状态" align="center" prop="status" width="100">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'warning':scope.row.status==='1'?'success':'danger'" size="small">
+            {{ scope.row.status==='0'?'待支付':scope.row.status==='1'?'已完成':'已取消' }}
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:storeOrder:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:storeOrder:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/storeOrder'
+
+export default {
+  name: 'StoreOrder',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 93 - 0
src/views/admin/sysCompany/index.vue

@@ -0,0 +1,93 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="租户名称" align="center" prop="companyName" />
+      <el-table-column label="联系人" align="center" prop="contactName" width="100" />
+      <el-table-column label="联系电话" align="center" prop="phone" width="120" />
+      <el-table-column label="状态" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'success':'danger'" size="small">{{ scope.row.status==='0'?'正常':'停用' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:sysCompany:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:sysCompany:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/sysCompany'
+
+export default {
+  name: 'SysCompany',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 94 - 0
src/views/admin/sysUser/index.vue

@@ -0,0 +1,94 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="员工姓名" align="center" prop="userName" width="100" />
+      <el-table-column label="手机号" align="center" prop="phonenumber" width="120" />
+      <el-table-column label="部门" align="center" prop="deptName" width="120" />
+      <el-table-column label="角色" align="center" prop="roleName" width="120" />
+      <el-table-column label="状态" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'success':'danger'" size="small">{{ scope.row.status==='0'?'正常':'停用' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:sysUser:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:sysUser:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/sysUser'
+
+export default {
+  name: 'SysUser',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 93 - 0
src/views/admin/videoResource/index.vue

@@ -0,0 +1,93 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="资源名称" align="center" prop="resourceName" />
+      <el-table-column label="资源类型" align="center" prop="resourceType" width="100" />
+      <el-table-column label="文件大小" align="center" prop="fileSize" width="100" />
+      <el-table-column label="状态" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'success':'danger'" size="small">{{ scope.row.status==='0'?'正常':'异常' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:videoResource:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:videoResource:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listVideoResource, deleteVideoResource } from '@/api/course/videoResource'
+
+export default {
+  name: 'VideoResource',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listVideoResource(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return deleteVideoResource(row.id || row.resourceId)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 95 - 0
src/views/admin/withdrawalManage/index.vue

@@ -0,0 +1,95 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="提现人" align="center" prop="withdrawalUser" width="120" />
+      <el-table-column label="提现金额" align="center" prop="amount" width="120" />
+      <el-table-column label="提现状态" align="center" prop="status" width="100">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'warning':scope.row.status==='1'?'success':'danger'" size="small">
+            {{ scope.row.status==='0'?'待审核':scope.row.status==='1'?'已通过':'已拒绝' }}
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="提现方式" align="center" prop="withdrawalType" width="120" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['admin:withdrawalManage:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['admin:withdrawalManage:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/withdrawalManage'
+
+export default {
+  name: 'WithdrawalManage',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 101 - 22
src/views/callRecord/index/index.vue

@@ -6,51 +6,83 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
-          v-hasPermi="['company:callRecord:add']">新增</el-button>
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+          v-hasPermi="['callRecord:add']">新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['callRecord:remove']">删除</el-button>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
-            v-hasPermi="['company:callRecord:edit']">修改</el-button>
+            v-hasPermi="['callRecord:edit']">修改</el-button>
           <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
-            v-hasPermi="['company:callRecord:remove']">删除</el-button>
+            v-hasPermi="['callRecord:remove']">删除</el-button>
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "Callrecord",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/callRecord/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/callRecord/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/callRecord", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/callRecord", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/callRecord/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 10 - 0
src/views/company/aiModel/inboundCallManage/inboundCallRecord.vue

@@ -0,0 +1,10 @@
+<template>
+  <div class="app-container">
+    <el-empty description="呼入记录功能开发中"></el-empty>
+  </div>
+</template>
+<script>
+export default {
+  name: 'InboundCallRecord'
+}
+</script>

+ 10 - 0
src/views/company/aiModel/inboundCallManage/index.vue

@@ -0,0 +1,10 @@
+<template>
+  <div class="app-container">
+    <el-empty description="呼入配置功能开发中"></el-empty>
+  </div>
+</template>
+<script>
+export default {
+  name: 'InboundCallManage'
+}
+</script>

+ 94 - 0
src/views/company/companyVoice/index.vue

@@ -0,0 +1,94 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="通话类型" align="center" prop="callType" width="100" />
+      <el-table-column label="主叫号码" align="center" prop="callerNumber" width="120" />
+      <el-table-column label="被叫号码" align="center" prop="calleeNumber" width="120" />
+      <el-table-column label="通话时长(秒)" align="center" prop="duration" width="110" />
+      <el-table-column label="状态" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'success':'danger'" size="small">{{ scope.row.status==='0'?'正常':'异常' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['company:companyVoice:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['company:companyVoice:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/company/companyVoice'
+
+export default {
+  name: 'CompanyVoice',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 93 - 0
src/views/company/companyVoiceBlacklist/index.vue

@@ -0,0 +1,93 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="黑名单号码" align="center" prop="phone" width="140" />
+      <el-table-column label="黑名单类型" align="center" prop="blacklistType" width="120" />
+      <el-table-column label="原因" align="center" prop="reason" />
+      <el-table-column label="状态" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'success':'danger'" size="small">{{ scope.row.status==='0'?'启用':'停用' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['company:companyVoiceBlacklist:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['company:companyVoiceBlacklist:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/company/companyVoiceBlacklist'
+
+export default {
+  name: 'CompanyVoiceBlacklist',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 93 - 0
src/views/company/companyVoiceConfig/index.vue

@@ -0,0 +1,93 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="配置名称" align="center" prop="configName" />
+      <el-table-column label="呼叫频率限制" align="center" prop="callFrequency" width="120" />
+      <el-table-column label="时间段" align="center" prop="timeRange" width="180" />
+      <el-table-column label="状态" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'success':'danger'" size="small">{{ scope.row.status==='0'?'启用':'停用' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['company:companyVoiceConfig:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['company:companyVoiceConfig:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/company/companyVoiceConfig'
+
+export default {
+  name: 'CompanyVoiceConfig',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 93 - 0
src/views/company/companyVoicePackage/index.vue

@@ -0,0 +1,93 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="套餐名称" align="center" prop="packageName" />
+      <el-table-column label="通话时长(分钟)" align="center" prop="duration" width="120" />
+      <el-table-column label="价格" align="center" prop="price" width="100" />
+      <el-table-column label="状态" align="center" prop="status" width="80">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.status==='0'?'success':'danger'" size="small">{{ scope.row.status==='0'?'上架':'下架' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"
+            v-hasPermi="['company:companyVoicePackage:query']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['company:companyVoicePackage:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { listApi, delApi } from '@/api/company/companyVoicePackage'
+
+export default {
+  name: 'CompanyVoicePackage',
+  data() {
+    return {
+      loading: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      listApi(this.queryParams).then(res => {
+        this.list = res.rows || (res.data && res.data.list) || []
+        this.total = res.total || (res.data && res.data.total) || 0
+        this.loading = false
+      }).catch(() => { this.loading = false })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    handleDetail(row) {
+      this.$message.info('详情功能开发中')
+    },
+    handleDelete(row) {
+      this.$modal.confirm('是否确认删除?').then(() => {
+        return delApi(row.id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {})
+    }
+  }
+}
+</script>

+ 10 - 0
src/views/company/companyWorkflowManage/index.vue

@@ -0,0 +1,10 @@
+<template>
+  <div class="app-container">
+    <el-empty description="工作流模板管理功能开发中"></el-empty>
+  </div>
+</template>
+<script>
+export default {
+  name: 'CompanyWorkflowManage'
+}
+</script>

+ 172 - 0
src/views/course/course.vue

@@ -0,0 +1,172 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable size="small"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+          v-hasPermi="['course:course:add']">新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['course:course:remove']">删除</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="课程名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+            v-hasPermi="['course:course:edit']">修改</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['course:course:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入课程名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
+export default {
+  name: "CourseCourse",
+  data() {
+    return {
+      loading: false,
+      ids: [],
+      multiple: true,
+      showSearch: true,
+      total: 0,
+      list: [],
+      title: "",
+      open: false,
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }]
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    getList() {
+      this.loading = true;
+      getRequest("/course/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id);
+      this.multiple = !selection.length;
+    },
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "新增课程";
+    },
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/course/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/course", this.form).then(() => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/course", this.form).then(() => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的课程?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/course/" + ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    }
+  }
+};
+</script>

+ 98 - 19
src/views/course/courseAnswerLog/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['course:courseAnswerLog:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['course:courseAnswerLog:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['course:courseAnswerLog:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "CourseCourseanswerlog",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/course/courseAnswerLog/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/course/courseAnswerLog/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/course/courseAnswerLog", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/course/courseAnswerLog", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/course/courseAnswerLog/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/course/courseQuestionCategory/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['course:courseQuestionCategory:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['course:courseQuestionCategory:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['course:courseQuestionCategory:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "CourseCoursequestioncategory",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/course/courseQuestionCategory/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/course/courseQuestionCategory/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/course/courseQuestionCategory", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/course/courseQuestionCategory", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/course/courseQuestionCategory/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/course/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['course:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['course:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['course:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "Course",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/course/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/course/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/course", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/course", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/course/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/course/period/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['course:period:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['course:period:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['course:period:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "CoursePeriod",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/course/period/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/course/period/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/course/period", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/course/period", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/course/period/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/course/playSourceConfig/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['course:playSourceConfig:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['course:playSourceConfig:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['course:playSourceConfig:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "CoursePlaysourceconfig",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/course/playSourceConfig/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/course/playSourceConfig/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/course/playSourceConfig", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/course/playSourceConfig", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/course/playSourceConfig/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/course/sopLogs/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['course:sopLogs:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['course:sopLogs:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['course:sopLogs:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "CourseSoplogs",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/course/sopLogs/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/course/sopLogs/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/course/sopLogs", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/course/sopLogs", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/course/sopLogs/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/course/trainingCamp/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['course:trainingCamp:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['course:trainingCamp:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['course:trainingCamp:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "CourseTrainingcamp",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/course/trainingCamp/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/course/trainingCamp/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/course/trainingCamp", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/course/trainingCamp", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/course/trainingCamp/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/course/userCourseCommentLike/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['course:userCourseCommentLike:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['course:userCourseCommentLike:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['course:userCourseCommentLike:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "CourseUsercoursecommentlike",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/course/userCourseCommentLike/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/course/userCourseCommentLike/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/course/userCourseCommentLike", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/course/userCourseCommentLike", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/course/userCourseCommentLike/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/course/userCourseFavorite/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['course:userCourseFavorite:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['course:userCourseFavorite:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['course:userCourseFavorite:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "CourseUsercoursefavorite",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/course/userCourseFavorite/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/course/userCourseFavorite/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/course/userCourseFavorite", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/course/userCourseFavorite", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/course/userCourseFavorite/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/course/userCourseNoteLike/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['course:userCourseNoteLike:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['course:userCourseNoteLike:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['course:userCourseNoteLike:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "CourseUsercoursenotelike",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/course/userCourseNoteLike/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/course/userCourseNoteLike/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/course/userCourseNoteLike", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/course/userCourseNoteLike", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/course/userCourseNoteLike/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/course/userCourseVideo/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['course:userCourseVideo:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['course:userCourseVideo:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['course:userCourseVideo:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "CourseUsercoursevideo",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/course/userCourseVideo/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/course/userCourseVideo/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/course/userCourseVideo", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/course/userCourseVideo", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/course/userCourseVideo/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/course/userTalentFollow/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['course:userTalentFollow:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['course:userTalentFollow:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['course:userTalentFollow:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "CourseUsertalentfollow",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/course/userTalentFollow/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/course/userTalentFollow/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/course/userTalentFollow", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/course/userTalentFollow", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/course/userTalentFollow/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/course/userVideoCommentLike/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['course:userVideoCommentLike:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['course:userVideoCommentLike:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['course:userVideoCommentLike:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "CourseUservideocommentlike",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/course/userVideoCommentLike/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/course/userVideoCommentLike/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/course/userVideoCommentLike", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/course/userVideoCommentLike", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/course/userVideoCommentLike/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/course/userVideoFavorite/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['course:userVideoFavorite:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['course:userVideoFavorite:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['course:userVideoFavorite:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "CourseUservideofavorite",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/course/userVideoFavorite/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/course/userVideoFavorite/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/course/userVideoFavorite", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/course/userVideoFavorite", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/course/userVideoFavorite/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/course/userVideoLike/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['course:userVideoLike:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['course:userVideoLike:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['course:userVideoLike:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "CourseUservideolike",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/course/userVideoLike/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/course/userVideoLike/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/course/userVideoLike", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/course/userVideoLike", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/course/userVideoLike/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/course/userVideoView/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['course:userVideoView:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['course:userVideoView:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['course:userVideoView:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "CourseUservideoview",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/course/userVideoView/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/course/userVideoView/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/course/userVideoView", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/course/userVideoView", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/course/userVideoView/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/course/videoTags/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['course:videoTags:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['course:videoTags:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['course:videoTags:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "CourseVideotags",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/course/videoTags/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/course/videoTags/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/course/videoTags", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/course/videoTags", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/course/videoTags/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/courseFinishTemp/course/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['courseFinishTemp:course:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['courseFinishTemp:course:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['courseFinishTemp:course:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "CoursefinishtempCourse",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/courseFinishTemp/course/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/courseFinishTemp/course/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/courseFinishTemp/course", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/courseFinishTemp/course", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/courseFinishTemp/course/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 10 - 0
src/views/crm/customerAiChat/index.vue

@@ -0,0 +1,10 @@
+<template>
+  <div class="app-container">
+    <el-empty description="AI话术润色功能开发中"></el-empty>
+  </div>
+</template>
+<script>
+export default {
+  name: 'CustomerAiChat'
+}
+</script>

+ 98 - 19
src/views/crm/customerAssign/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['crm:customerAssign:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['crm:customerAssign:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['crm:customerAssign:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "CrmCustomerassign",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/crm/customerAssign/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/crm/customerAssign/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/crm/customerAssign", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/crm/customerAssign", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/crm/customerAssign/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 10 - 0
src/views/crm/customerBusiness/index.vue

@@ -0,0 +1,10 @@
+<template>
+  <div class="app-container">
+    <el-empty description="商机管理功能开发中"></el-empty>
+  </div>
+</template>
+<script>
+export default {
+  name: 'CustomerBusiness'
+}
+</script>

+ 10 - 0
src/views/crm/customerBusiness/my.vue

@@ -0,0 +1,10 @@
+<template>
+  <div class="app-container">
+    <el-empty description="我的商机功能开发中"></el-empty>
+  </div>
+</template>
+<script>
+export default {
+  name: 'MyBusiness'
+}
+</script>

+ 98 - 19
src/views/crm/customerLevel/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['crm:customerLevel:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['crm:customerLevel:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['crm:customerLevel:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "CrmCustomerlevel",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/crm/customerLevel/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/crm/customerLevel/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/crm/customerLevel", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/crm/customerLevel", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/crm/customerLevel/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/fastGpt/fastGptChatReplaceText/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['fastGpt:fastGptChatReplaceText:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['fastGpt:fastGptChatReplaceText:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['fastGpt:fastGptChatReplaceText:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "FastgptFastgptchatreplacetext",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/fastGpt/fastGptChatReplaceText/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/fastGpt/fastGptChatReplaceText/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/fastGpt/fastGptChatReplaceText", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/fastGpt/fastGptChatReplaceText", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/fastGpt/fastGptChatReplaceText/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 10 - 0
src/views/fastGpt/redPack/redPackage.vue

@@ -0,0 +1,10 @@
+<template>
+  <div class="app-container">
+    <el-empty description="红包管理功能开发中"></el-empty>
+  </div>
+</template>
+<script>
+export default {
+  name: 'RedPackage'
+}
+</script>

+ 98 - 19
src/views/his/FsFollowReport/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:FsFollowReport:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:FsFollowReport:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:FsFollowReport:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisFsfollowreport",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/FsFollowReport/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/FsFollowReport/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/FsFollowReport", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/FsFollowReport", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/FsFollowReport/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/city/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:city:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:city:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:city:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisCity",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/city/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/city/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/city", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/city", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/city/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/doctor/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:doctor:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:doctor:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:doctor:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisDoctor",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/doctor/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/doctor/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/doctor", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/doctor", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/doctor/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/doctorBill/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:doctorBill:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:doctorBill:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:doctorBill:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisDoctorbill",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/doctorBill/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/doctorBill/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/doctorBill", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/doctorBill", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/doctorBill/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/doctorExtract/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:doctorExtract:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:doctorExtract:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:doctorExtract:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisDoctorextract",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/doctorExtract/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/doctorExtract/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/doctorExtract", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/doctorExtract", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/doctorExtract/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/doctorOperLog/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:doctorOperLog:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:doctorOperLog:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:doctorOperLog:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisDoctoroperlog",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/doctorOperLog/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/doctorOperLog/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/doctorOperLog", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/doctorOperLog", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/doctorOperLog/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/doctorProduct/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:doctorProduct:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:doctorProduct:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:doctorProduct:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisDoctorproduct",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/doctorProduct/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/doctorProduct/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/doctorProduct", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/doctorProduct", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/doctorProduct/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/healthArticle/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:healthArticle:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:healthArticle:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:healthArticle:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisHealtharticle",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/healthArticle/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/healthArticle/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/healthArticle", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/healthArticle", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/healthArticle/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/logs/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:logs:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:logs:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:logs:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisLogs",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/logs/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/logs/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/logs", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/logs", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/logs/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/packageFavorite/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:packageFavorite:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:packageFavorite:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:packageFavorite:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisPackagefavorite",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/packageFavorite/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/packageFavorite/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/packageFavorite", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/packageFavorite", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/packageFavorite/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/pharmacist/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:pharmacist:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:pharmacist:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:pharmacist:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisPharmacist",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/pharmacist/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/pharmacist/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/pharmacist", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/pharmacist", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/pharmacist/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/price/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:price:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:price:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:price:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisPrice",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/price/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/price/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/price", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/price", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/price/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/promotionActive/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:promotionActive:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:promotionActive:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:promotionActive:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisPromotionactive",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/promotionActive/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/promotionActive/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/promotionActive", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/promotionActive", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/promotionActive/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/promotionActiveLog/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:promotionActiveLog:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:promotionActiveLog:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:promotionActiveLog:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisPromotionactivelog",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/promotionActiveLog/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/promotionActiveLog/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/promotionActiveLog", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/promotionActiveLog", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/promotionActiveLog/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/storeAfterSales/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:storeAfterSales:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:storeAfterSales:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:storeAfterSales:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisStoreaftersales",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/storeAfterSales/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/storeAfterSales/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/storeAfterSales", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/storeAfterSales", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/storeAfterSales/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/storeBill/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:storeBill:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:storeBill:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:storeBill:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisStorebill",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/storeBill/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/storeBill/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/storeBill", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/storeBill", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/storeBill/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/storeExtract/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:storeExtract:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:storeExtract:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:storeExtract:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisStoreextract",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/storeExtract/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/storeExtract/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/storeExtract", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/storeExtract", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/storeExtract/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/storeLog/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:storeLog:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:storeLog:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:storeLog:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisStorelog",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/storeLog/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/storeLog/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/storeLog", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/storeLog", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/storeLog/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/template/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:template:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:template:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:template:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisTemplate",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/template/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/template/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/template", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/template", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/template/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/userAddress/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:userAddress:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:userAddress:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:userAddress:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisUseraddress",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/userAddress/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/userAddress/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/userAddress", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/userAddress", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/userAddress/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/userBill/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:userBill:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:userBill:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:userBill:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisUserbill",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/userBill/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/userBill/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/userBill", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/userBill", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/userBill/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/userExtract/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:userExtract:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:userExtract:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:userExtract:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisUserextract",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/userExtract/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/userExtract/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/userExtract", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/userExtract", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/userExtract/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/userNewTask/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:userNewTask:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:userNewTask:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:userNewTask:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisUsernewtask",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/userNewTask/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/userNewTask/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/userNewTask", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/userNewTask", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/userNewTask/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/his/userOperationLog/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['his:userOperationLog:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['his:userOperationLog:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['his:userOperationLog:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "HisUseroperationlog",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/his/userOperationLog/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/his/userOperationLog/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/his/userOperationLog", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/his/userOperationLog", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/his/userOperationLog/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 12 - 0
src/views/hisStore/storeOrder/storeList.vue

@@ -0,0 +1,12 @@
+<template>
+  <div class="app-container">
+    <store-order />
+  </div>
+</template>
+<script>
+import StoreOrder from './index'
+export default {
+  name: 'StoreList',
+  components: { StoreOrder }
+}
+</script>

+ 12 - 0
src/views/hisStore/storeRedundSales/index.vue

@@ -0,0 +1,12 @@
+<template>
+  <div class="app-container">
+    <store-after-sales />
+  </div>
+</template>
+<script>
+import StoreAfterSales from '../storeAfterSales/index'
+export default {
+  name: 'StoreRedundSales',
+  components: { StoreAfterSales }
+}
+</script>

+ 98 - 19
src/views/live/healthLiveOrder/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['live:healthLiveOrder:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['live:healthLiveOrder:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['live:healthLiveOrder:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "LiveHealthliveorder",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/live/healthLiveOrder/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/live/healthLiveOrder/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/live/healthLiveOrder", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/live/healthLiveOrder", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/live/healthLiveOrder/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/live/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['live:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['live:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['live:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "Live",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/live/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/live/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/live", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/live", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/live/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

+ 98 - 19
src/views/live/issue/index/index.vue

@@ -6,21 +6,33 @@
           @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
           v-hasPermi="['live:issue:add']">新增</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
+          @click="handleDelete" v-hasPermi="['live:issue:remove']">删除</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="ID" align="center" prop="id" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" width="80" />
+      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['live:issue:edit']">修改</el-button>
@@ -29,28 +41,48 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+
+    <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
+
 export default {
   name: "LiveIssue",
   data() {
     return {
       loading: true,
       ids: [],
-      single: true,
       multiple: true,
       showSearch: true,
       total: 0,
       list: [],
+      title: "",
+      open: false,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         keyword: null
-      }
+      },
+      form: {},
+      rules: {
+        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
+      },
     };
   },
   created() {
@@ -59,10 +91,15 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      // TODO: 接入API
-      this.list = [];
-      this.total = 0;
-      this.loading = false;
+      getRequest("/live/issue/list", this.queryParams).then(response => {
+        this.list = response.rows || [];
+        this.total = response.total || 0;
+        this.loading = false;
+      }).catch(() => {
+        this.list = [];
+        this.total = 0;
+        this.loading = false;
+      });
     },
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -72,22 +109,64 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = { id: null, name: null };
+      this.resetForm("form");
+    },
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
-      this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
     handleAdd() {
-      this.$message.info("新增功能开发中");
+      this.reset();
+      this.open = true;
+      this.title = "新增";
     },
     handleUpdate(row) {
-      this.$message.info("修改功能开发中");
+      this.reset();
+      const id = row.id || this.ids;
+      getRequest("/live/issue/" + id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            putRequest("/live/issue", this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            postRequest("/live/issue", this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
     },
     handleDelete(row) {
-      this.$modal.confirm("是否确认删除?").then(() => {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        return delRequest("/live/issue/" + ids);
+      }).then(() => {
+        this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
-    }
-  }
+    },
+  },
 };
 </script>

Some files were not shown because too many files changed in this diff