Browse Source

Merge branch 'qz_daily_0.0.1' into http_test

qinzhipeng_v@didiglobal.com 4 years ago
parent
commit
4581791fe3

+ 46 - 0
src/api/admin/index.js

@@ -0,0 +1,46 @@
+import request from '@/utils/request'
+import { TeamManagement } from '@/apiConfig/api'
+
+// 创建checkList
+export function createTemplate(data) {
+  return request({
+    url: TeamManagement + `/checklist/createTemplate`,
+    method: 'post',
+    data
+  })
+}
+
+// 编辑checkList
+export function updateTemplate(data) {
+  return request({
+    url: TeamManagement + `/checklist/updateTemplate`,
+    method: 'post',
+    data
+  })
+}
+
+// 获取checkList列表
+export function selectTemplates(data) {
+  return request({
+    url: TeamManagement + `/checklist/selectTemplates`,
+    method: 'post',
+    data
+  })
+}
+
+// 删除checkList
+export function deleteTemplate(data) {
+  return request({
+    url: TeamManagement + `/checklist/deleteTemplate?templateId=${data}`,
+    method: 'get'
+  })
+}
+
+// 删除业务线checklist模板
+export function deleteBizTemplate(data) {
+  return request({
+    url: TeamManagement + `/checklist/deleteBizTemplate`,
+    method: 'post',
+    data
+  })
+}

+ 16 - 0
src/api/toConfigure.js

@@ -178,3 +178,19 @@ export function updateBiz(data) {
   })
 }
 
+// 查询该业务线可添加的checkoutlist模块
+export function selectBizUnAddTemplates(data) {
+  return request({
+    url: TeamManagement + `/checklist/selectBizUnAddTemplates?bizId=${data}`,
+    method: 'get'
+  })
+}
+
+// 新增业务线checklist模板
+export function addBizTemplates(data) {
+  return request({
+    url: TeamManagement + `/checklist/addBizTemplates`,
+    method: 'post',
+    data
+  })
+}

+ 8 - 1
src/components/newLayout/Head.vue

@@ -44,6 +44,10 @@
               <el-button v-if="navTagType === 2" type="primary" plain size="small" @click="setNavTagType(1)">侧边导航</el-button>
             </div>
             <div class="line" />
+            <div class="user-logout">
+              <el-button type="primary" plain size="small" @click="administratorsJump()"> 管 理 员 </el-button>
+            </div>
+            <div class="line" />
             <div class="user-logout">
               <el-button type="primary" plain size="small" @click="layout()">退出登录</el-button>
             </div>
@@ -125,6 +129,9 @@ export default {
     topHome() {
       this.$router.push({ path: '/' })
     },
+    administratorsJump() {
+      this.$router.push({ name: '管理员' })
+    },
     // websocket数据接收
     websocketonmessage(e) {
       const { hasReminding } = JSON.parse(e.data)
@@ -227,7 +234,7 @@ export default {
   }
 }
 .user-control {
-  height: 143px;
+  height: 190px;
   width: 95px;
   display: flex;
   flex-direction: column;

+ 0 - 1
src/components/select/searchPeople.vue

@@ -74,7 +74,6 @@ export default {
   watch: {
     value: {
       handler(newV, oldV) {
-        console.log(this.searchValue, newV, this.searchValue === newV)
         if (this.searchValue === newV) {
           return
         }

+ 10 - 0
src/icons/svg/admin-model1.svg

@@ -0,0 +1,10 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="13.055" height="14.26" viewBox="0 0 13.055 14.26">
+  <g id="数据模块" transform="translate(-68.946 -10.417)">
+    <path id="路径_13072" data-name="路径 13072" d="M75.35,24.677a.382.382,0,0,1-.218-.064L73.54,23.7a.455.455,0,0,1-.164-.609.446.446,0,0,1,.609-.155l1.364.782,5.339-3.084V18.819a.446.446,0,0,1,.446-.446.437.437,0,0,1,.446.446v2.1a.455.455,0,0,1-.218.391l-5.785,3.3A.409.409,0,0,1,75.35,24.677Zm-4.4-2.583a.409.409,0,0,1-.227,0l-1.383-.819a.455.455,0,0,1-.218-.391V14.207a.455.455,0,0,1,.218-.391l5.794-3.338a.437.437,0,0,1,.446,0l5.785,3.338a.455.455,0,0,1,.218.391v1.455a.437.437,0,0,1-.446.446.446.446,0,0,1-.446-.446v-1.2L75.35,11.379l-5.339,3.084v6.167l1.155.673a.428.428,0,0,1,.164.6A.446.446,0,0,1,70.948,22.094Z" transform="translate(-0.171)" fill="#559df7"/>
+    <path id="路径_13073" data-name="路径 13073" d="M75.179,249.716a.4.4,0,0,1-.218-.064l-5.785-3.275a.437.437,0,0,1-.173-.6.446.446,0,0,1,.609-.173l5.785,3.275a.446.446,0,0,1-.218.837Z" transform="translate(0 -231.788)" fill="#559df7"/>
+    <path id="路径_13074" data-name="路径 13074" d="M489.081,254a.446.446,0,0,1-.218-.837l5.458-3.083a.446.446,0,0,1,.609.173.455.455,0,0,1-.164.609l-5.458,3.083A.482.482,0,0,1,489.081,254Z" transform="translate(-413.72 -236.204)" fill="#559df7"/>
+    <path id="路径_13075" data-name="路径 13075" d="M476.606,482.951a.446.446,0,0,1-.446-.446v-6.531a.455.455,0,1,1,.91,0v6.531a.446.446,0,0,1-.464.446Z" transform="translate(-401.426 -458.493)" fill="#559df7"/>
+    <path id="路径_13076" data-name="路径 13076" d="M842.637,504.717m-1.037,0a1.037,1.037,0,1,0,1.037-1.037A1.037,1.037,0,0,0,841.6,504.717Z" transform="translate(-761.672 -486.253)" fill="#559df7"/>
+    <path id="路径_13077" data-name="路径 13077" d="M159.117,750.477m-1.037,0a1.037,1.037,0,1,0,1.037-1.037A1.037,1.037,0,0,0,158.08,750.477Z" transform="translate(-87.867 -728.52)" fill="#559df7"/>
+  </g>
+</svg>

+ 4 - 0
src/icons/svg/admin_check.svg

@@ -0,0 +1,4 @@
+
+<svg xmlns="http://www.w3.org/2000/svg" width="14.2" height="14.2" viewBox="0 0 14.2 14.2">
+  <path id="模块设置" d="M69.6,64H64.7a.7.7,0,0,0-.7.7v4.9a.7.7,0,0,0,.7.7h4.9a.7.7,0,0,0,.7-.7V64.7a.7.7,0,0,0-.7-.7Zm0,5.6H64.7V64.7h4.9v4.9Zm0,2.1H64.7a.7.7,0,0,0-.7.7v4.9a.7.7,0,0,0,.7.7h4.9a.7.7,0,0,0,.7-.7V72.4a.7.7,0,0,0-.7-.7Zm0,5.6H64.7V72.4h4.9v4.9ZM77.3,64H72.4a.7.7,0,0,0-.7.7v4.9a.7.7,0,0,0,.7.7h4.9a.7.7,0,0,0,.7-.7V64.7A.7.7,0,0,0,77.3,64Zm0,5.6H72.4V64.7h4.9v4.9Zm-4.9,4.9a.349.349,0,0,0-.35.35v2.8a.35.35,0,0,0,.7,0v-2.8A.349.349,0,0,0,72.4,74.5Zm1.75,0a.349.349,0,0,0-.35.35v2.8a.35.35,0,0,0,.7,0v-2.8A.349.349,0,0,0,74.15,74.5Zm1.75-1.4a.349.349,0,0,0-.35.35v4.2a.35.35,0,0,0,.7,0v-4.2A.349.349,0,0,0,75.9,73.1Zm1.75-.7a.349.349,0,0,0-.35.35v4.9a.35.35,0,0,0,.7,0v-4.9A.349.349,0,0,0,77.65,72.4Z" transform="translate(-63.9 -63.9)" fill="#fff" stroke="#fff" stroke-width="0.2"/>
+</svg>

+ 10 - 0
src/icons/svg/admin_model.svg

@@ -0,0 +1,10 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="13.055" height="14.26" viewBox="0 0 13.055 14.26">
+  <g id="数据模块" transform="translate(-68.946 -10.417)">
+    <path id="路径_13072" data-name="路径 13072" d="M75.35,24.677a.382.382,0,0,1-.218-.064L73.54,23.7a.455.455,0,0,1-.164-.609.446.446,0,0,1,.609-.155l1.364.782,5.339-3.084V18.819a.446.446,0,0,1,.446-.446.437.437,0,0,1,.446.446v2.1a.455.455,0,0,1-.218.391l-5.785,3.3A.409.409,0,0,1,75.35,24.677Zm-4.4-2.583a.409.409,0,0,1-.227,0l-1.383-.819a.455.455,0,0,1-.218-.391V14.207a.455.455,0,0,1,.218-.391l5.794-3.338a.437.437,0,0,1,.446,0l5.785,3.338a.455.455,0,0,1,.218.391v1.455a.437.437,0,0,1-.446.446.446.446,0,0,1-.446-.446v-1.2L75.35,11.379l-5.339,3.084v6.167l1.155.673a.428.428,0,0,1,.164.6A.446.446,0,0,1,70.948,22.094Z" transform="translate(-0.171)" fill="#444"/>
+    <path id="路径_13073" data-name="路径 13073" d="M75.179,249.716a.4.4,0,0,1-.218-.064l-5.785-3.275a.437.437,0,0,1-.173-.6.446.446,0,0,1,.609-.173l5.785,3.275a.446.446,0,0,1-.218.837Z" transform="translate(0 -231.788)" fill="#444"/>
+    <path id="路径_13074" data-name="路径 13074" d="M489.081,254a.446.446,0,0,1-.218-.837l5.458-3.083a.446.446,0,0,1,.609.173.455.455,0,0,1-.164.609l-5.458,3.083A.482.482,0,0,1,489.081,254Z" transform="translate(-413.72 -236.204)" fill="#444"/>
+    <path id="路径_13075" data-name="路径 13075" d="M476.606,482.951a.446.446,0,0,1-.446-.446v-6.531a.455.455,0,1,1,.91,0v6.531a.446.446,0,0,1-.464.446Z" transform="translate(-401.426 -458.493)" fill="#444"/>
+    <path id="路径_13076" data-name="路径 13076" d="M842.637,504.717m-1.037,0a1.037,1.037,0,1,0,1.037-1.037A1.037,1.037,0,0,0,841.6,504.717Z" transform="translate(-761.672 -486.253)" fill="#444"/>
+    <path id="路径_13077" data-name="路径 13077" d="M159.117,750.477m-1.037,0a1.037,1.037,0,1,0,1.037-1.037A1.037,1.037,0,0,0,158.08,750.477Z" transform="translate(-87.867 -728.52)" fill="#444"/>
+  </g>
+</svg>

+ 8 - 0
src/icons/svg/admin_业务线.svg

@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="14.5" viewBox="0 0 16 14.5">
+  <g id="业务管理_1_" data-name="业务管理 (1)" transform="translate(-125.673 -130.816)">
+    <path id="路径_13135" data-name="路径 13135" d="M432.95,271.313h-4.3a.43.43,0,0,1,0-.86h4.3a.43.43,0,0,1,0,.86Zm0,2.581h-4.3a.43.43,0,0,1,0-.86h4.3a.43.43,0,1,1,0,.86Z" transform="translate(-296.141 -136.61)" fill="#fff"/>
+    <path id="路径_13136" data-name="路径 13136" d="M320.888,138.989a.43.43,0,0,1-.43-.43v-6.883h-7.743v6.883a.43.43,0,0,1-.86,0v-7.313a.43.43,0,0,1,.43-.43h8.6a.43.43,0,0,1,.43.43v7.313A.43.43,0,0,1,320.888,138.989Z" transform="translate(-181.366 0)" fill="#fff"/>
+    <path id="路径_13137" data-name="路径 13137" d="M198.072,230.359h-2.151a.43.43,0,0,1-.43-.43v-5.592a.43.43,0,0,1,.43-.43h2.151a.43.43,0,0,1,.43.43v5.592A.43.43,0,0,1,198.072,230.359Zm-1.721-.86h1.29v-4.732h-1.29Z" transform="translate(-68.528 -91.37)" fill="#fff"/>
+    <path id="路径_13138" data-name="路径 13138" d="M141.2,532.9H126.143a.452.452,0,0,1-.471-.43v-5.592a.452.452,0,0,1,.471-.43H132.1a.468.468,0,0,1,.446.294l.52,1.426h1.675l.52-1.426a.469.469,0,0,1,.446-.294H141.2a.452.452,0,0,1,.471.43v5.592A.452.452,0,0,1,141.2,532.9Zm-14.588-.86h14.118v-4.732h-4.68l-.52,1.426a.469.469,0,0,1-.446.294h-2.353a.468.468,0,0,1-.446-.294l-.52-1.426h-5.152Z" transform="translate(0 -387.588)" fill="#fff"/>
+  </g>
+</svg>

+ 7 - 0
src/router/index.js

@@ -69,6 +69,13 @@ export const constantRoutes = [{
   hidden: true
 },
 
+{
+  path: '/administrators',
+  name: '管理员',
+  component: () => import('@/views/administrators/index.vue'),
+  hidden: true
+},
+
 {
   path: '/env-platform',
   component: Layout,

+ 85 - 0
src/views/ToConfigure/components/adminIndex.vue

@@ -0,0 +1,85 @@
+<template>
+  <div>
+    <el-container class="admin-back">
+      <el-aside width="215px" class="admin-conent">
+        <!-- 导航 -->
+        <admin-nav :datas="datas" :type="1" @delete="deleteTemplate" @createDialog="show = true" @clickName="getNavList" @querySelect="selectTemplates" />
+        <!-- 导航 -->
+      </el-aside>
+      <el-main style="padding: 0; margin-left: 10px" class="admin-conent">
+        <!-- 内容 -->
+        <adminContent :data="admin_content" :type="1" />
+        <!-- 内容 -->
+        <!-- 创建/编辑 -->
+        <Configure ref="configure" :show.sync="show" :title="'增加模版项'" @update="selectTemplates" />
+        <!-- 创建/编辑 -->
+      </el-main>
+    </el-container>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import { selectTemplates, deleteBizTemplate } from '@/api/admin/index'
+import Configure from './toConfigureNodel.vue'
+import adminNav from '@/views/administrators/components/adminNav.vue'
+import adminContent from '@/views/administrators/components/adminContent.vue'
+export default {
+  components: {
+    adminContent,
+    adminNav,
+    Configure
+  },
+  data() {
+    return {
+      show: false,
+      datas: [],
+      admin_content: {}
+    }
+  },
+  computed: {
+    ...mapGetters(['bizId'])
+  },
+  created() {
+    this.selectTemplates()
+  },
+  methods: {
+    async selectTemplates(val) {
+      this.show = false
+      const ruleForm = { bizId: this.bizId }
+      if (val) {
+        ruleForm.name = val
+        delete ruleForm.content
+        delete ruleForm.type
+      }
+      const res = await selectTemplates(ruleForm)
+      if (res.code === 200) {
+        this.admin_content = res.data[0] || { name: '无数据', content: '暂无无数据' }
+        this.datas = res.data || [{ name: '无数据', content: '无数据' }]
+      }
+    },
+    async deleteTemplate(cal) {
+      const res = await deleteBizTemplate({ bizId: this.bizId, templateId: cal.id })
+      if (res.code === 200) {
+        this.selectTemplates()
+        this.$refs.configure.selectBizUnAddTemplates()
+        this.$message({ message: '模块删除成功', type: 'success', duration: 1000, offset: 150 })
+      }
+    },
+    getNavList(val) {
+      this.admin_content = val
+    }
+  }
+}
+</script>
+
+<style>
+.admin-back {
+   background: #f2f3f6;
+}
+.admin-conent {
+  min-height: calc(100vh - 80px);
+  border-radius: 4px;
+  background: #FFF;
+}
+</style>

+ 96 - 0
src/views/ToConfigure/components/toConfigureNodel.vue

@@ -0,0 +1,96 @@
+<template>
+  <el-dialog :title="title" :visible.sync="show" width="30%" class="demo-dialog" :before-close="handleClose" :close-on-click-modal="false">
+    <div class="blueStripe" />
+    <el-form ref="ruleForm" :model="ruleForm" label-position="left" status-icon :rules="rules" label-width="80px">
+      <el-form-item label="请选择" prop="name">
+        <el-select v-model="ruleForm.name" multiple placeholder="请选择" style="width: 100%;">
+          <el-option v-for="(item,index) in modelList" :key="item.id + index" :label="item.name" :value="item.id" />
+        </el-select>
+      </el-form-item>
+    </el-form>
+    <span slot="footer" class="dialog-footer">
+      <el-button @click="handleClose">取 消</el-button>
+      <el-button type="primary" @click="createTemplate">保 存</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import { selectBizUnAddTemplates, addBizTemplates } from '@/api/toConfigure.js'
+export default {
+  props: {
+    data: { type: Object, default: null },
+    show: { type: Boolean, default: false, required: true },
+    title: { type: String, default: '增加模版项' }
+  },
+  data() {
+    return {
+      ruleForm: {
+        name: []
+      },
+      modelList: [],
+      rules: {
+        name: [{ required: true, message: '请输入名称', trigger: 'change' }]
+      }
+    }
+  },
+  computed: {
+    ...mapGetters(['bizId'])
+  },
+  created() {
+    this.selectBizUnAddTemplates()
+  },
+  methods: {
+    async selectBizUnAddTemplates() {
+      const res = await selectBizUnAddTemplates(this.bizId)
+      if (res.code === 200) {
+        this.modelList = res.data
+      }
+    },
+    createTemplate() {
+      this.$refs.ruleForm.validate(async(valid) => {
+        if (valid) {
+          const data = { bizId: this.bizId, templateIds: this.ruleForm.name }
+          const res = await addBizTemplates(data)
+          if (res.code === 200) {
+            this.selectBizUnAddTemplates()
+            this.$emit('update')
+            this.$nextTick(() => {
+              this.$refs.ruleForm.resetFields()
+            })
+            this.$message({ message: '模块添加成功', type: 'success', duration: 1000, offset: 150 })
+          }
+        }
+      })
+    },
+    handleClose() {
+      this.$emit('update')
+      this.ruleForm.name = []
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.demo-ruleForm {
+  padding: 0 30px;
+}
+.demo-dialog {
+  /deep/ .el-dialog__title {
+    line-height: 24px;
+    font-size: 16px;
+    color: #303133;
+    padding-left: 10px;
+}
+}
+.blueStripe {
+  width:4px;
+  height:17px;
+  background:#409EFF;
+  border-radius:1px;
+  position: absolute;
+  top: 23px;
+  left: 20px;
+}
+</style>

+ 7 - 2
src/views/ToConfigure/index.vue

@@ -7,6 +7,7 @@
         <el-tab-pane label="需求方向配置" name="second" />
         <el-tab-pane label="技术模块配置" name="third" />
         <el-tab-pane label="通知配置" name="fourth" />
+        <el-tab-pane label="checkList模版" name="check" />
         <el-tab-pane label="业务线配置" name="fourths" />
       </el-tabs>
     </el-header>
@@ -23,7 +24,8 @@
         <Business v-if="tabIndex === '1'" class="member_padding" />
         <Technology v-if="tabIndex === '2'" class="member_padding" />
         <notice-config v-if="tabIndex === '3'" class="member_padding" />
-        <biz-configure v-if="tabIndex === '4'" class="member_padding" />
+        <admin-page v-if="tabIndex === '4'" />
+        <biz-configure v-if="tabIndex === '5'" class="member_padding" />
       </el-main>
     </el-container>
   </el-container>
@@ -36,6 +38,7 @@ import Technology from './components/businessTechnology.vue'
 import noticeConfig from './components/noticeConfig.vue'
 import memberConfiguration from './components/memberConfiguration.vue'
 import MemberDetails from './components/MemberDetails.vue'
+import adminPage from './components/adminIndex.vue'
 
 export default {
   components: {
@@ -44,7 +47,8 @@ export default {
     Technology,
     noticeConfig,
     memberConfiguration,
-    MemberDetails
+    MemberDetails,
+    adminPage
   },
   data() {
     return {
@@ -55,6 +59,7 @@ export default {
   },
   methods: {
     handleClick(tab, event) {
+      console.log(tab, event)
       this.tabIndex = tab.index
     },
     detailslist(val) {

+ 66 - 0
src/views/administrators/components/adminContent.vue

@@ -0,0 +1,66 @@
+<template>
+  <el-container>
+    <el-header style="height: auto;">
+      <div class="admin-content-title">{{ data.name }}
+        <i v-if="data.type === 2 && type !== 1" class="el-icon-edit admin-content-update" @click="$emit('update', '编辑', data)" />
+      </div>
+    </el-header>
+    <el-main>
+      <div v-html="data.content" />
+      <div v-if="data.onlineModule" class="admin-content-online admin-content-start">
+        <span style="margin-right: 10px;">上线顺序</span>
+        <div v-for="(item, index) in data.onlineModule.onlineOrder" :key="index" style="margin: 0 10px;">
+          <div class="admin-content-start admin-content-item"><div class="admin-content-code">{{ index + 1 }}</div> {{ item }} </div>
+        </div>
+      </div>
+    </el-main>
+  </el-container>
+</template>
+
+<script>
+export default {
+  props: {
+    data: { type: Object, required: true },
+    type: { type: Number, default: 1 }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.admin-content-title {
+  font-size: 16px;
+  font-family: PingFang SC;
+  font-weight: 500;
+  padding-top: 20px;
+  color: #444444;
+}
+.admin-content-item {
+  font-weight: 400;
+  color: #999999;
+  font-size: 14px;
+}
+.admin-content-code {
+  width: 16px;
+  height: 16px;
+  line-height: 14px;
+  text-align: center;
+  border: 1px solid #999;
+  border-radius: 50%;
+  margin: 2px 5px;
+}
+.admin-content-online {
+  font-size: 14px;
+  font-family: Microsoft Sans Serif;
+  font-weight: 400;
+  color: #444444;
+  margin: 20px 0;
+}
+.admin-content-start {
+  display: flex;
+  justify-content: flex-start;
+}
+.admin-content-update {
+  cursor: pointer;
+  color: #409eff;
+}
+</style>

+ 127 - 0
src/views/administrators/components/adminNav.vue

@@ -0,0 +1,127 @@
+<template>
+  <el-container>
+    <el-header class="admin-nav-header admin-nav-between">
+      <el-input v-model="admin_query" placeholder="请输入内容" clearable size="small" @change="$emit('querySelect', admin_query)">
+        <i slot="prefix" class="el-input__icon el-icon-search" />
+      </el-input>
+      <div class="admin-nav-div">
+        <i class="el-icon-circle-plus-outline admin-nav-icon" @click="$emit('createDialog', '新建')" />
+      </div>
+    </el-header>
+    <el-main style="padding: 10px; max-height: calc(100vh - 129px); overflow-y: auto;">
+      <div v-for="(item, index) in admin_navList" :key="index" class="admin-nav-between admin-nav-col">
+        <div class="admin-nav-start admin-nav-cursor">
+          <svg-icon :icon-class="index === adminColor ? 'admin-model1' : 'admin_model'" />
+          <el-tooltip v-if="item.name.length >= 9" class="item" effect="dark" :content="item.name" placement="top">
+            <div class="admin-nav-name admin-nav-cursor" :class="{'admin-name-color': index === adminColor}" @click="$emit('clickName', item), adminColor = index"> {{ item.name }} </div>
+          </el-tooltip>
+          <div v-else class="admin-nav-name admin-nav-cursor" :class="{'admin-name-color': index === adminColor}" @click="$emit('clickName', item), adminColor = index"> {{ item.name }} </div>
+        </div>
+        <i v-if="type === 1" class="el-icon-close admin-nav-cursor" @click="deleteModel = true, deleteId = item" />
+        <i v-else-if="item.type === 2" class="el-icon-close admin-nav-cursor" @click="deleteModel = true, deleteId = item" />
+      </div>
+    </el-main>
+
+    <el-dialog title="移除确认" :visible.sync="deleteModel" class="demo-dialog" width="30%">
+      <div class="blueStripe" />
+      <div align="center">是否要移除 {{ deleteId.name }} ? </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="deleteModel = false">取 消</el-button>
+        <el-button type="primary" @click="$emit('delete', deleteId), deleteModel = false">确 定</el-button>
+      </span>
+    </el-dialog>
+  </el-container>
+</template>
+
+<script>
+export default {
+  props: {
+    datas: { type: Array, required: true },
+    type: { type: Number, default: 1 }
+  },
+  data() {
+    return {
+      adminColor: '',
+      deleteModel: false, // 删除dialog
+      deleteId: {},
+      admin_query: '', // checkList模版查询
+      admin_navList: []
+    }
+  },
+  watch: {
+    datas: {
+      handler(newV) {
+        this.admin_navList = newV
+      },
+      deep: true
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.admin-nav-header {
+  padding: 15px 10px;
+}
+.admin-nav-icon {
+  border-radius: 4px;
+  margin-left: 10px;
+  line-height: 34px;
+  font-size: 20px;
+  cursor: pointer;
+  color: #888;
+}
+.admin-nav-icon:hover {
+  color: #409eff;
+}
+.admin-nav-between {
+  display: flex;
+  justify-content: space-between;
+}
+.admin-nav-start {
+  display: flex;
+  justify-content: flex-start;
+}
+
+.admin-nav-col {
+  line-height: 15px;
+  margin-bottom: 20px;
+}
+.admin-nav-div {
+  line-height: 30px;
+}
+.admin-nav-cursor:hover {
+  cursor: pointer;
+  color: #409eff;
+}
+.admin-name-color {
+  color:  #409eff;
+}
+.admin-nav-name {
+  width: 149px;
+  font-size: 14px;
+  font-family: Microsoft Sans Serif;
+  font-weight: 400;
+  padding-left: 10px;
+  overflow: hidden;
+  text-overflow:ellipsis;
+  white-space: nowrap;
+}
+.demo-dialog {
+  /deep/ .el-dialog__title {
+    line-height: 24px;
+    font-size: 16px;
+    color: #303133;
+    padding-left: 10px;
+}
+}
+.blueStripe {
+  width:4px;
+  height:17px;
+  background:#409EFF;
+  border-radius:1px;
+  position: absolute;
+  top: 23px;
+  left: 20px;
+}
+</style>

+ 109 - 0
src/views/administrators/components/createAdmin.vue

@@ -0,0 +1,109 @@
+<template>
+  <el-dialog :title="title" :visible.sync="show" width="60%" class="demo-dialog" :before-close="handleClose">
+    <div class="blueStripe" />
+    <el-form ref="ruleForm" :model="ruleForm" label-position="left" status-icon :rules="rules" label-width="60px" class="demo-ruleForm">
+      <el-form-item label="名称" prop="name">
+        <el-input v-model="ruleForm.name" placeholder="请输入模版名称" />
+      </el-form-item>
+      <el-form-item label="内容" prop="content">
+        <normal-area :id="'admin-template' + title" :value.sync="ruleForm.content" :height="394" />
+      </el-form-item>
+    </el-form>
+    <span slot="footer" class="dialog-footer">
+      <el-button @click="handleClose">取 消</el-button>
+      <el-button type="primary" @click="createTemplate"> {{ title === '新建模版' ? '创 建' : '保 存' }}</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+import normalArea from '@/components/input/normalArea' // 富文本
+import 'tinymce/plugins/table'// 插入表格插件
+import { createTemplate, updateTemplate } from '@/api/admin/index'
+export default {
+  components: {
+    normalArea
+  },
+  props: {
+    data: { type: Object, default: null },
+    show: { type: Boolean, default: false, required: true },
+    title: { type: String, default: '标题' }
+  },
+  data() {
+    return {
+      ruleForm: {},
+      rules: {
+        name: [
+          { required: true, message: '请输入名称', trigger: 'change' },
+          { max: 20, message: '最多20个字符', trigger: 'blur' }
+        ],
+        content: [{ required: true, message: '富文本不能为空', trigger: 'change' }]
+      }
+    }
+  },
+  watch: {
+    data: {
+      handler(newV) {
+        if (newV) {
+          this.ruleForm = newV
+        } else {
+          this.$refs.ruleForm.resetFields()
+          this.ruleForm = {}
+        }
+      },
+      deep: true,
+      immediate: true
+    }
+  },
+  methods: {
+    createTemplate() {
+      this.ruleForm.type = 2
+      this.ruleForm.isCheck = false
+      this.ruleForm.belongType = 1
+      this.$refs.ruleForm.validate(async(valid) => {
+        if (valid) {
+          if (this.title === '新建模版') {
+            const res = await createTemplate(this.ruleForm)
+            if (res.code === 200) {
+              this.$emit('update')
+              this.$message({ message: '模块添加成功', type: 'success', center: true })
+            }
+          } else if (this.title === '编辑模版') {
+            const res = await updateTemplate(this.ruleForm)
+            if (res.code === 200) {
+              this.$emit('update')
+              this.$message({ message: '模块修改成功', type: 'success', center: true })
+            }
+          }
+        }
+      })
+    },
+    handleClose() {
+      this.$emit('update')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.demo-ruleForm {
+  padding: 0 30px;
+}
+.demo-dialog {
+  /deep/ .el-dialog__title {
+    line-height: 24px;
+    font-size: 16px;
+    color: #303133;
+    padding-left: 10px;
+}
+}
+.blueStripe {
+  width:4px;
+  height:17px;
+  background:#409EFF;
+  border-radius:1px;
+  position: absolute;
+  top: 23px;
+  left: 20px;
+}
+</style>

+ 139 - 0
src/views/administrators/index.vue

@@ -0,0 +1,139 @@
+<template>
+  <el-container>
+    <el-header class="admin-title" style="padding: 0;">
+      <div class="admin-zhihui" @click="$router.push({ name: '首页' })"><img :src="logo"> 质惠</div>
+      <div class="admin-title">
+        <div class="admin-nav"><svg-icon icon-class="admin_业务线" class="admin-margin" /> 业务线管理</div>
+        <div class="admin-nav" @click="jump()"><svg-icon icon-class="admin_check" class="admin-margin" /> checklist模块管理</div>
+      </div>
+    </el-header>
+    <el-container class="admin-back">
+      <el-aside width="215px" class="admin-conent">
+        <!-- 导航 -->
+        <admin-nav
+          :type="2"
+          :datas="datas"
+          @querySelect="querySelect"
+          @close="show = false"
+          @createDialog="createDialog"
+          @clickName="getNavList"
+          @delete="deleteTemplate"
+        />
+        <!-- 导航 -->
+      </el-aside>
+      <el-main style="padding: 0; margin: 10px" class="admin-conent">
+        <!-- 内容 -->
+        <adminContent :data="admin_content" :type="2" @update="createDialog" />
+        <!-- 内容 -->
+        <!-- 创建/编辑 -->
+        <adminDialog :show.sync="show" :title="admin_title + '模版'" :data="admin_data_list" @update="selectTemplates" />
+        <!-- 创建/编辑 -->
+      </el-main>
+    </el-container>
+  </el-container>
+</template>
+
+<script>
+import logoUrl from '@/assets/内页logo2@2x.png'
+import adminNav from './components/adminNav.vue'
+import adminContent from './components/adminContent.vue'
+import adminDialog from './components/createAdmin.vue'
+import { deleteTemplate, selectTemplates } from '@/api/admin/index'
+export default {
+  components: {
+    adminNav,
+    adminContent,
+    adminDialog
+  },
+  data() {
+    return {
+      show: false,
+      datas: [],
+      logo: logoUrl,
+      admin_content: {},
+      admin_data_list: {},
+      admin_title: '新建'
+    }
+  },
+  created() {
+    this.selectTemplates()
+  },
+  methods: {
+    async selectTemplates(val) {
+      this.show = false
+      const ruleForm = { name: '', content: '', type: 2, belongType: 1 }
+      if (val) {
+        ruleForm.name = val
+        delete ruleForm.content
+        delete ruleForm.type
+      }
+      const res = await selectTemplates(ruleForm)
+      if (res.code === 200) {
+        this.admin_content = res.data[0]
+        this.datas = res.data
+      }
+    },
+    createDialog(ele, val) { // 新建还是编辑
+      console.log(ele, '新建还是编辑')
+      this.admin_data_list = val
+      this.admin_title = ele
+      this.show = true
+    },
+    querySelect(val) { // 查询
+      this.selectTemplates(val)
+    },
+    async deleteTemplate(ele) {
+      const res = await deleteTemplate(ele.id)
+      if (res.code === 200) {
+        this.selectTemplates()
+        this.$message({ message: '模块移除成功', type: 'success', center: true })
+      }
+    },
+    getNavList(val) { // 点击导航展示content
+      this.admin_content = val
+    },
+    jump() {
+      this.$router.push({ name: '管理员' })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.admin-title {
+  background: #409eff;
+  line-height: 60px;
+  color: #FFFFFF;
+  font-size: 14px;
+  display: flex;
+  justify-content: flex-start;
+}
+.admin-zhihui {
+  width: 215px;
+  text-align: center;
+  color: #FFFFFF;
+  font-weight: 600;
+  font-size: 20pt;
+  cursor: pointer;
+  font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
+  }
+.admin-nav {
+  cursor: pointer;
+  margin: 0 50px 0 20px;
+  padding: 0 10px;
+}
+.admin-nav:hover {
+  background: #1e89f7;
+}
+.admin-back {
+   background: #eee;
+}
+.admin-margin {
+  margin-right: 10px;
+}
+.admin-conent {
+  min-height: calc(100vh - 80px);
+  border-radius: 4px;
+  background: #FFF;
+}
+</style>