admin/src/api/business/carEvent.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
admin/src/api/business/company.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
admin/src/assets/images/ar_more@2x.png | 补丁 | 查看 | 原始文档 | blame | 历史 | |
admin/src/assets/images/peizhi_add@2x.png | 补丁 | 查看 | 原始文档 | blame | 历史 | |
admin/src/assets/images/peizhi_ar@2x.png | 补丁 | 查看 | 原始文档 | blame | 历史 | |
admin/src/components/business/OperaInternalCompanyWindow.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
admin/src/components/common/companySelect.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
admin/src/views/business/approvalConfiguration.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
admin/src/views/business/carEvent.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
admin/src/views/business/internalCompany.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
admin/src/api/business/carEvent.js
@@ -6,3 +6,11 @@ trim: true }) } // 导åºExcel export function exportExcel (data) { return request.post('/business/carEvent/exportExcel', data, { trim: true, download: true }) } admin/src/api/business/company.js
@@ -1,12 +1,18 @@ import request from '../../utils/request' // æ¥è¯¢ export function fetchList (data) { return request.post('/business/company/page', data, { export function fetchList (type) { return request.get(`/business/company/tree?type=${type}`, { trim: true }) } // export function fetchList (data) { // return request.post('/business/company/page', data, { // trim: true // }) // } // å建 export function create (data) { return request.post('/business/company/create', data) admin/src/assets/images/ar_more@2x.png
admin/src/assets/images/peizhi_add@2x.png
admin/src/assets/images/peizhi_ar@2x.png
admin/src/components/business/OperaInternalCompanyWindow.vue
@@ -6,8 +6,11 @@ @confirm="confirm" > <el-form :model="form" ref="form" :rules="rules"> <el-form-item label="åç§°" prop="name"> <el-input v-model="form.name" placeholder="请è¾å ¥åç§°" v-trim/> <el-form-item label="ä¸çº§ç»ç»" prop="parentId"> <companySelect v-if="visible" v-model="form.parentId" placeholder="è¯·éæ©ä¸çº§èå" clearable :inline="false"/> </el-form-item> <el-form-item label="ç»ç»åç§°" prop="name"> <el-input v-model="form.name" placeholder="请è¾å ¥ç»ç»åç§°" v-trim/> </el-form-item> </el-form> </GlobalWindow> @@ -16,20 +19,32 @@ <script> import BaseOpera from '@/components/base/BaseOpera' import GlobalWindow from '@/components/common/GlobalWindow' import companySelect from '@/components/common/companySelect' export default { name: 'OperaInternalCompanyWindow', extends: BaseOpera, components: { GlobalWindow }, components: { GlobalWindow, companySelect }, data () { return { options: [], // è¡¨åæ°æ® form: { id: null, name: '' name: '', parentId: [], disable: false }, // éªè¯è§å rules: { name: [ { required: true, message: '请è¾å ¥ç»ç»åç§°' } ] } } }, props: { list: { type: Array } }, created () { @@ -37,6 +52,54 @@ api: '/business/company', 'field.id': 'id' }) }, methods: { // 确认æ°å»º/ä¿®æ¹ confirm () { this.$refs.form.validate((valid) => { if (!valid) { return } // è°ç¨æ°å»ºæ¥å£ this.isWorking = true if (this.form.id == null || this.form.id === '') { this.api.create({ parentId: this.form.parentId, name: this.form.name, type: 1 }) .then(() => { this.visible = false this.$tip.apiSuccess('æ°å»ºæå') this.$emit('success') }) .catch(e => { this.$tip.apiFailed(e) }) .finally(() => { this.isWorking = false }) } else { this.api.updateById({ id: this.form.id, parentId: this.form.parentId, name: this.form.name, type: 1 }) .then(() => { this.visible = false this.$tip.apiSuccess('ä¿®æ¹æå') this.$emit('success') }) .catch(e => { this.$tip.apiFailed(e) }) .finally(() => { this.isWorking = false }) } }) } } } </script> admin/src/components/common/companySelect.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,84 @@ <template> <TreeSelect :placeholder="placeholder" :value="value" :data="data" :append-to-body="appendToBody" :clearable="clearable" :inline="inline" @input="$emit('input', $event)" /> </template> <script> import TreeSelect from './TreeSelect' import { fetchList } from '@/api/business/company' export default { name: 'MenuSelect', components: { TreeSelect }, props: { value: {}, inline: { default: true }, placeholder: { default: 'è¯·éæ©èå' }, // æ¯å¦å¯æ¸ 空 clearable: { default: false }, appendToBody: { default: false }, // é被æé¤çé¨é¨ID excludeId: {} }, data () { return { data: [] } }, watch: { excludeId () { this.fetchData() } }, methods: { // è·åææèå fetchData () { fetchList(1) .then(records => { this.data = [] this.__fillData(this.data, records) }) .catch(e => { this.$tip.apiFailed(e) }) }, // å¡«å èåæ __fillData (list, pool) { for (const menu of pool) { if (menu.id === this.excludeId) { continue } const menuNode = { id: menu.id, label: menu.name } list.push(menuNode) if (menu.childList != null && menu.childList.length > 0) { menuNode.children = [] this.__fillData(menuNode.children, menu.childList) if (menuNode.children.length === 0) { menuNode.children = undefined } } } } }, created () { this.fetchData() } } </script> admin/src/views/business/approvalConfiguration.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,412 @@ <template> <TableLayout> <template v-slot:table-wrap> <div class="config"> <div class="config_list"> <div class="config_list_head"> <span>é ç½®æµç¨</span> <el-button style="background: #435EBE;" type="primary">åå¸</el-button> </div> <div class="config_list_list"> <div class="item"> <div class="item_label">å起人</div> <div class="item_child"> <div class="item_child_label">ç¨æ¥æ</div> <div class="item_child_val">访客</div> </div> <div class="item_down"> <div class="item_down_x"> <img src="@/assets/images/peizhi_ar@2x.png" alt="" /> </div> </div> </div> <div :class="item.active ? 'item yellow active' : 'item yellow'" v-for="(item, index) in list" :key="index" @click="seleItem(index)"> <div class="item_label">审æ¹äºº</div> <div class="item_child" style="cursor: pointer;"> <img class="item_child_right" src="@/assets/images/ar_more@2x.png" /> <div class="item_child_label">被访人</div> <div class="item_child_val">访客</div> </div> <div class="item_down"> <img class="item_down_add" v-if="list.length - 1 === index" src="@/assets/images/peizhi_add@2x.png" @click.stop="add" /> <div class="item_down_x"> <img src="@/assets/images/peizhi_ar@2x.png" alt="" /> </div> </div> </div> <div class="item blue" style="height: 81px;"> <div class="item_label">æé人</div> <div class="item_child" style="cursor: pointer;height: 40px;"> <img class="item_child_right" src="@/assets/images/ar_more@2x.png" /> <div class="item_child_val" style="margin-top: 3px;">请设置æé人</div> </div> <div class="item_down"> <div class="item_down_x"> <img src="@/assets/images/peizhi_ar@2x.png" alt="" /> </div> </div> </div> <div class="footer"> <span>æµç¨ç»æ</span> </div> </div> </div> <div class="config_data"> <div class="config_data_item"> <div class="config_data_item_label"> éæ©è¯¥èç¹ç审æ¹äºº </div> <el-radio-group v-model="radio"> <el-radio :label="0">被访人</el-radio> <el-radio :label="1">æå®äººå</el-radio> <el-radio :label="2">é¨é¨ä¸»ç®¡</el-radio> </el-radio-group> <div class="config_data_item_reviewed" v-if="radio === 1"> <div class="config_data_item_reviewed_label"> <span>æå®å®¡æ ¸äºº</span> <span>ä¸è¶ è¿20人</span> </div> <div class="config_data_item_reviewed_content"> <div class="config_data_item_reviewed_content_item"> <span>æ åå¥</span> <i class="el-icon-close"></i> </div> <span class="add">+æ·»å </span> </div> </div> <div class="config_data_item_reviewed" v-if="radio === 2"> <div class="config_data_item_reviewed_label"> <span>é¨é¨ä¸»ç®¡</span> </div> <div class="config_data_item_reviewed_r"> <span>被访人ç</span> <el-select v-model="value" placeholder="è¯·éæ©" style="margin: 0 20px 0 10px;"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> <el-checkbox v-model="checked">æ¾ä¸å°ä¸»ç®¡æ¶ï¼ç±ä¸çº§ä¸»ç®¡ä»£å®¡æ ¸</el-checkbox> </div> </div> </div> <div class="config_data_item" v-if="radio !== 0"> <div class="config_data_item_label"> å®¡æ¹æ¹å¼ <span>审æ¹äººä¸ºå¤ä¸ªæ¶ï¼éç¨çå®¡æ¹æ¹å¼</span> </div> <el-radio-group v-model="radio1" style="display: flex; flex-direction: column;"> <el-radio :label="0" style="margin-bottom: 20px;">æç¾ï¼å ¶ä¸ä¸å审æ¹äººåæææç»å³å¯ï¼</el-radio> <el-radio :label="1">ä¼ç¾ï¼ææå®¡æ¹äººé½åææå¯éè¿ï¼</el-radio> </el-radio-group> </div> <div class="config_data_item" v-if="radio === 2"> <div class="config_data_item_label"> 审æ¹äººä¸ºç©ºæ¶ </div> <el-checkbox-group v-model="checkList" style="display: flex; flex-direction: column;"> <el-checkbox label="å¤éæ¡ A" style="margin-bottom: 20px;"></el-checkbox> <el-checkbox label="å¤éæ¡ B" style="margin-bottom: 20px;"></el-checkbox> <el-checkbox label="å¤éæ¡ C"></el-checkbox> </el-checkbox-group> </div> <div class="config_data_submit" v-if="radio !== 0"> <el-button style="background: #435EBE;" type="primary">ä¿æé 置项</el-button> </div> </div> </div> </template> </TableLayout> </template> <script> import TableLayout from '@/layouts/TableLayout' export default { name: 'config', components: { TableLayout }, data () { return { list: [ { name: '', active: false } ], value: '', options: [], radio: 0, radio1: 0, checked: '', checkList: [] } }, methods: { add () { this.list.push({ name: '', active: false }) }, seleItem (i) { this.list.forEach((item, index) => { item.active = index === i }) } } } </script> <style lang="scss" scoped> .config { width: 100%; padding-bottom: 20px; box-sizing: border-box; height: calc(100vh - 140px); display: flex; align-items: center; justify-content: space-between; .config_list { width: 543px; height: 100%; flex-shrink: 0; border-radius: 2px; padding: 20px; box-sizing: border-box; border: 1px solid #EEEEEE; background: #F7F7F7; .config_list_head { width: 100%; height: 40px; display: flex; align-items: center; justify-content: space-between; span { font-size: 18px; font-weight: 500; color: #222222; } } .config_list_list { width: 100%; height: calc(100% - 40px); padding-top: 45px; box-sizing: border-box; overflow-y: scroll; display: flex; align-items: center; flex-direction: column; &::-webkit-scrollbar { width: 0; } .active { border: 2px solid #E84A08 !important; } .yellow { background: #EE8921 !important; } .blue { background: #435EBE !important; } .footer { width: 106px; height: 41px; background: #FFFFFF; box-shadow: 0px 0px 8px 0px rgba(0,0,0,0.1); border-radius: 25px; display: flex; align-items: center; justify-content: center; span { font-size: 15px; font-weight: 400; color: #333333; } } .item { width: 200px; height: 102px; background: #7999D9; box-shadow: 0 0 8px 0 rgba(0,0,0,0.1); border-radius: 4px; padding: 4px; box-sizing: border-box; display: flex; flex-direction: column; justify-content: space-between; position: relative; margin-bottom: 60px; &:last-child { margin: 0 !important; } .item_down { position: absolute; bottom: -60px; width: 100%; height: 60px; display: flex; align-items: center; justify-content: center; .item_down_add { width: 46px; height: 46px; position: absolute; z-index: 3; top: 5px; cursor: pointer; } .item_down_x { width: 1px; height: 60px; background: #B2B2B2; position: relative; img { position: absolute; bottom: 0; left: -4px; width: 9px; height: 9px; } } } .item_label { width: 100%; height: 30px; display: flex; align-items: center; font-size: 15px; font-weight: 400; color: #FFFFFF; } .item_child { width: 100%; height: 61px; padding: 10px; box-sizing: border-box; background: #FFFFFF; border-radius: 4px; position: relative; .item_child_right { position: absolute; right: 10px; top: 13px; width: 8px; height: 14px; } .item_child_label { font-size: 14px; font-weight: 400; color: #333333; margin-bottom: 4px; } .item_child_val { font-size: 12px; font-weight: 400; color: #999999; } } } } } .config_data { flex: 1; height: 100%; margin-left: 20px; .config_data_submit { margin-top: 50px; } .config_data_item { width: 100%; display: flex; flex-direction: column; margin-bottom: 30px; &:last-child { margin: 0 !important; } .config_data_item_label { font-size: 16px; font-weight: 500; color: #222222; margin-bottom: 20px; span { font-size: 12px; font-weight: 400; color: #999999; margin-left: 10px; } } .config_data_item_reviewed { width: 100%; margin-top: 20px; .config_data_item_reviewed_r { margin-top: 10px; width: 100%; display: flex; align-items: center; span { flex-shrink: 0; font-size: 14px; font-weight: 400; color: #666666; } } .config_data_item_reviewed_label { display: flex; align-items: center; span { &:nth-child(1) { font-size: 14px; font-weight: 400; color: #222222; } &:nth-child(2) { font-size: 12px; font-weight: 400; color: #999999; margin-left: 8px; } } } .config_data_item_reviewed_content { width: 400px; margin-top: 10px; height: 110px; padding: 12px; box-sizing: border-box; border-radius: 2px; border: 1px solid #DFE2E8; display: flex; align-items: flex-start; flex-wrap: wrap; .add { font-size: 12px; font-weight: 400; color: #435EBE; cursor: pointer; margin-top: 3px; } .config_data_item_reviewed_content_item { padding: 3px 5px; background: #F4F7FC; border-radius: 2px; box-sizing: border-box; margin-right: 10px; margin-bottom: 10px; span { font-size: 12px; font-weight: 400; color: #333333; } i { color: #949BA2; margin-left: 10px; cursor: pointer; } } } } } } } </style> admin/src/views/business/carEvent.vue
@@ -51,7 +51,7 @@ <!-- è¡¨æ ¼åå页 --> <template v-slot:table-wrap> <ul class="toolbar" v-permissions="['business:carevent:exportExcel']"> <li><el-button type="primary" v-permissions="['business:carevent:exportExcel']">导åº</el-button></li> <li><el-button type="primary" :loading="isWorking.export" v-permissions="['business:carevent:exportExcel']" @click="exportExcel">导åº</el-button></li> </ul> <el-table v-loading="isWorking.search" admin/src/views/business/internalCompany.vue
@@ -1,75 +1,71 @@ <template> <TableLayout :permissions="['business:company:query']"> <TableLayout> <!-- :permissions="['business:company:query']"--> <!-- æç´¢è¡¨å --> <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline> <el-form-item label="ç»ç»åç§°" prop="name"> <el-input v-model="searchForm.name" placeholder="请è¾å ¥ç»ç»åç§°" @keypress.enter.native="search"></el-input> </el-form-item> <el-form-item label="æå±ä¸çº§ç»ç»" prop="parentName"> <el-input v-model="searchForm.parentName" placeholder="请è¾å ¥æå±ä¸çº§ç»ç»" @keypress.enter.native="search"></el-input> </el-form-item> <section> <el-button type="primary" @click="search">æç´¢</el-button> <el-button @click="reset">éç½®</el-button> </section> </el-form> <!-- <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>--> <!-- <el-form-item label="ç»ç»åç§°" prop="name">--> <!-- <el-input v-model="searchForm.name" placeholder="请è¾å ¥ç»ç»åç§°" @keypress.enter.native="search"></el-input>--> <!-- </el-form-item>--> <!-- <el-form-item label="æå±ä¸çº§ç»ç»" prop="parentName">--> <!-- <el-input v-model="searchForm.parentName" placeholder="请è¾å ¥æå±ä¸çº§ç»ç»" @keypress.enter.native="search"></el-input>--> <!-- </el-form-item>--> <!-- <section>--> <!-- <el-button type="primary" @click="search">æç´¢</el-button>--> <!-- <el-button @click="reset">éç½®</el-button>--> <!-- </section>--> <!-- </el-form>--> <!-- è¡¨æ ¼åå页 --> <template v-slot:table-wrap> <ul class="toolbar" v-permissions="['business:company:create', 'business:company:delete']"> <li><el-button type="primary" v-permissions="['business:company:create']" @click="synchronous()">忥</el-button></li> <!-- <li><el-button type="primary" v-permissions="['business:company:create']" @click="synchronous()">忥</el-button></li>--> <li><el-button type="primary" v-permissions="['business:company:create']" @click="$refs.OperaInternalCompanyWindow.open('æ°å»ºä¼ä¸')">æ°å»º</el-button></li> </ul> <el-table v-loading="isWorking.search" :data="tableData.list" :data="list" stripe :tree-props="{children: 'childList'}" row-key="id" @selection-change="handleSelectionChange" > <el-table-column type="selection" width="55"></el-table-column> <!-- <el-table-column type="selection" width="55"></el-table-column>--> <el-table-column prop="name" label="ç»ç»åç§°" min-width="100px"></el-table-column> <el-table-column prop="parentName" label="ä¸çº§ç»ç»" min-width="100px"></el-table-column> <el-table-column prop="editDate" label="æåæ´æ°æ¶é´" min-width="100px"></el-table-column> <!-- <el-table-column--> <!-- v-if="containPermissions(['business:company:update', 'business:company:delete'])"--> <!-- label="æä½"--> <!-- min-width="80"--> <!-- fixed="right"--> <!-- >--> <!-- <template slot-scope="{row}">--> <!-- <el-button type="text" @click="$refs.OperaInternalCompanyWindow.open('ç¼è¾ä¼ä¸ä¿¡æ¯è¡¨', row)" icon="el-icon-edit" v-permissions="['business:company:update']">ç¼è¾</el-button>--> <!-- <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:company:delete']">å é¤</el-button>--> <!-- </template>--> <!-- </el-table-column>--> <el-table-column label="æä½" width="230" fixed="right" > <template slot-scope="{row}"> <el-button type="text" @click="$refs.OperaInternalCompanyWindow.open('ç¼è¾ä¼ä¸ä¿¡æ¯', row)" icon="el-icon-edit" v-permissions="['business:company:update']">ç¼è¾</el-button> <el-button type="text" @click="$refs.OperaInternalCompanyWindow.open('æ°å»ºå级', { disable: true, parentId: row.id })" icon="el-icon-plus">æ°å»ºå级</el-button> <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:company:delete']">å é¤</el-button> </template> </el-table-column> </el-table> <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination" > </pagination> </template> <!-- æ°å»º/ä¿®æ¹ --> <!-- <OperaInternalCompanyWindow ref="OperaInternalCompanyWindow" @success="handlePageChange"/>--> <OperaInternalCompanyWindow ref="OperaInternalCompanyWindow" :list="list" @success="handlePageChange"/> </TableLayout> </template> <script> import BaseTable from '@/components/base/BaseTable' import TableLayout from '@/layouts/TableLayout' import Pagination from '@/components/common/Pagination' import { companySync } from '@/api/business/company' // import OperaInternalCompanyWindow from '@/components/business/OperaInternalCompanyWindow' // import { companySync } from '@/api/business/company' import OperaInternalCompanyWindow from '@/components/business/OperaInternalCompanyWindow' export default { name: 'internalCompany', extends: BaseTable, components: { TableLayout, Pagination }, components: { TableLayout, OperaInternalCompanyWindow }, data () { return { // æç´¢ searchForm: { name: '', parentName: '', type: 1 } }, list: [], total: 0 } }, created () { @@ -82,12 +78,27 @@ this.search() }, methods: { // åæ¥ä¿¡æ¯ async synchronous () { const message = await companySync({}) this.$message.success(message) this.search() // 页ç åæ´å¤ç handlePageChange (pageIndex) { this.__checkApi() this.isWorking.search = true this.api.fetchList(this.searchForm.type) .then(data => { this.list = data }) .catch(e => { this.$tip.apiFailed(e) }) .finally(() => { this.isWorking.search = false }) } // åæ¥ä¿¡æ¯ // async synchronous () { // const message = await companySync({}) // this.$message.success(message) // this.search() // } } } </script>