From 71a9eef518f2f2f1a1eb2fb90f2eb8ab7b155bc8 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 08 一月 2026 14:57:56 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_天津军泰伟业' into dev_天津军泰伟业
---
src/views/salesManagement/salespersonManagement/index.vue | 595 +++++++++++++++++++++++++++++++++--------------------------
1 files changed, 330 insertions(+), 265 deletions(-)
diff --git a/src/views/salesManagement/salespersonManagement/index.vue b/src/views/salesManagement/salespersonManagement/index.vue
index e597538..3f25d9a 100644
--- a/src/views/salesManagement/salespersonManagement/index.vue
+++ b/src/views/salesManagement/salespersonManagement/index.vue
@@ -2,146 +2,207 @@
<div class="app-container">
<el-card class="box-card">
<!-- 鎼滅储鍖哄煙 -->
- <el-row :gutter="20" class="search-row">
+ <el-row :gutter="20"
+ class="search-row">
<el-col :span="6">
- <el-input
- v-model="searchForm.name"
- placeholder="璇疯緭鍏ヤ笟鍔″憳濮撳悕"
- clearable
- @keyup.enter="handleSearch"
- >
+ <el-input v-model="searchForm.name"
+ placeholder="璇疯緭鍏ヤ笟鍔″憳濮撳悕"
+ clearable
+ @keyup.enter="handleSearch">
<template #prefix>
- <el-icon><Search /></el-icon>
+ <el-icon>
+ <Search />
+ </el-icon>
</template>
</el-input>
</el-col>
<el-col :span="6">
- <el-select v-model="searchForm.department" placeholder="璇烽�夋嫨閮ㄩ棬" clearable>
- <el-option label="閿�鍞儴" value="閿�鍞儴"></el-option>
- <el-option label="甯傚満閮�" value="甯傚満閮�"></el-option>
- <el-option label="瀹㈡湇閮�" value="瀹㈡湇閮�"></el-option>
+ <el-select v-model="searchForm.department"
+ placeholder="璇烽�夋嫨閮ㄩ棬"
+ clearable>
+ <el-option label="閿�鍞儴"
+ value="閿�鍞儴"></el-option>
+ <el-option label="甯傚満閮�"
+ value="甯傚満閮�"></el-option>
+ <el-option label="瀹㈡湇閮�"
+ value="瀹㈡湇閮�"></el-option>
</el-select>
</el-col>
<el-col :span="6">
- <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" clearable>
- <el-option label="鍦ㄨ亴" value="鍦ㄨ亴"></el-option>
- <el-option label="绂昏亴" value="绂昏亴"></el-option>
- <el-option label="璇曠敤鏈�" value="璇曠敤鏈�"></el-option>
+ <el-select v-model="searchForm.status"
+ placeholder="璇烽�夋嫨鐘舵��"
+ clearable>
+ <el-option label="鍦ㄨ亴"
+ value="鍦ㄨ亴"></el-option>
+ <el-option label="绂昏亴"
+ value="绂昏亴"></el-option>
+ <el-option label="璇曠敤鏈�"
+ value="璇曠敤鏈�"></el-option>
</el-select>
</el-col>
<el-col :span="6">
- <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
+ <el-button type="primary"
+ @click="handleSearch">鎼滅储</el-button>
<el-button @click="resetSearch">閲嶇疆</el-button>
- <el-button type="primary" style="float: right;" @click="handleAdd">鏂板涓氬姟鍛�</el-button>
+ <el-button type="primary"
+ style="float: right;"
+ @click="handleAdd">鏂板涓氬姟鍛�</el-button>
</el-col>
</el-row>
-
<!-- 涓氬姟鍛樺垪琛� -->
- <el-table
- :data="filteredList"
- style="width: 100%"
- v-loading="loading"
- border
- stripe
- height="calc(100vh - 22em)"
- >
- <el-table-column prop="id" label="ID" width="80" align="center"/>
- <el-table-column prop="name" label="濮撳悕" width="120" />
- <el-table-column prop="phone" label="鑱旂郴鐢佃瘽" width="140" />
- <el-table-column prop="email" label="閭" width="200" />
- <el-table-column prop="department" label="閮ㄩ棬" width="100" />
- <el-table-column prop="position" label="鑱屼綅" width="100" />
- <el-table-column prop="hireDate" label="鍏ヨ亴鏃ユ湡" width="120" />
- <el-table-column prop="status" label="鐘舵��" width="80">
+ <el-table :data="filteredList"
+ style="width: 100%"
+ v-loading="loading"
+ border
+ stripe
+ height="calc(100vh - 22em)">
+ <el-table-column prop="id"
+ label="ID"
+ width="80"
+ align="center" />
+ <el-table-column prop="name"
+ label="濮撳悕"
+ width="120" />
+ <el-table-column prop="phone"
+ label="鑱旂郴鐢佃瘽"
+ width="140" />
+ <el-table-column prop="email"
+ label="閭"
+ width="200" />
+ <el-table-column prop="department"
+ label="閮ㄩ棬"
+ width="100" />
+ <el-table-column prop="position"
+ label="鑱屼綅"
+ width="100" />
+ <el-table-column prop="hireDate"
+ label="鍏ヨ亴鏃ユ湡"
+ width="120" />
+ <el-table-column prop="status"
+ label="鐘舵��"
+ width="80">
<template #default="scope">
<el-tag :type="getStatusType(scope.row.status)">
{{ scope.row.status }}
</el-tag>
</template>
</el-table-column>
- <el-table-column prop="permissions" label="鏉冮檺">
+ <el-table-column prop="permissions"
+ label="鏉冮檺">
<template #default="scope">
- <el-tag v-for="perm in scope.row.permissionsList" :key="perm" size="small" style="margin-right: 5px;">
+ <el-tag v-for="perm in scope.row.permissionsList"
+ :key="perm"
+ size="small"
+ style="margin-right: 5px;">
{{ perm }}
</el-tag>
</template>
</el-table-column>
- <el-table-column label="鎿嶄綔" width="200" fixed="right" align="center">
+ <el-table-column label="鎿嶄綔"
+ width="200"
+ fixed="right"
+ align="center">
<template #default="scope">
- <el-button link type="primary" @click="handleEdit(scope.row)">缂栬緫</el-button>
- <el-button link type="primary" @click="handlePermissions(scope.row)">鏉冮檺</el-button>
- <el-button link type="danger" @click="handleDelete(scope.row)">鍒犻櫎</el-button>
+ <el-button link
+ type="primary"
+ @click="handleEdit(scope.row)">缂栬緫</el-button>
+ <el-button link
+ type="primary"
+ @click="handlePermissions(scope.row)">鏉冮檺</el-button>
+ <el-button link
+ type="danger"
+ @click="handleDelete(scope.row)">鍒犻櫎</el-button>
</template>
</el-table-column>
</el-table>
-
<!-- 鍒嗛〉 -->
- <pagination
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="pagination.current"
- :limit="pagination.size"
- @pagination="handleCurrentChange"
- />
+ <pagination :total="total"
+ layout="total, sizes, prev, pager, next, jumper"
+ :page="pagination.current"
+ :limit="pagination.size"
+ @pagination="handleCurrentChange" />
</el-card>
-
<!-- 鏂板/缂栬緫瀵硅瘽妗� -->
- <el-dialog v-model="dialogVisible" :title="dialogTitle" width="600px">
- <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
+ <el-dialog v-model="dialogVisible"
+ :title="dialogTitle"
+ width="600px">
+ <el-form :model="form"
+ :rules="rules"
+ ref="formRef"
+ label-width="100px">
<el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="濮撳悕" prop="name">
- <el-input v-model="form.name" placeholder="璇疯緭鍏ュ鍚�"></el-input>
+ <el-form-item label="濮撳悕"
+ prop="name">
+ <el-input v-model="form.name"
+ placeholder="璇疯緭鍏ュ鍚�"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
- <el-input v-model="form.phone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�"></el-input>
+ <el-form-item label="鑱旂郴鐢佃瘽"
+ prop="phone">
+ <el-input v-model="form.phone"
+ placeholder="璇疯緭鍏ヨ仈绯荤數璇�"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="閭" prop="email">
- <el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�"></el-input>
+ <el-form-item label="閭"
+ prop="email">
+ <el-input v-model="form.email"
+ placeholder="璇疯緭鍏ラ偖绠�"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="閮ㄩ棬" prop="department">
- <el-select v-model="form.department" placeholder="璇烽�夋嫨閮ㄩ棬" style="width: 100%">
- <el-option label="閿�鍞儴" value="閿�鍞儴"></el-option>
- <el-option label="甯傚満閮�" value="甯傚満閮�"></el-option>
- <el-option label="瀹㈡湇閮�" value="瀹㈡湇閮�"></el-option>
+ <el-form-item label="閮ㄩ棬"
+ prop="department">
+ <el-select v-model="form.department"
+ placeholder="璇烽�夋嫨閮ㄩ棬"
+ style="width: 100%">
+ <el-option label="閿�鍞儴"
+ value="閿�鍞儴"></el-option>
+ <el-option label="甯傚満閮�"
+ value="甯傚満閮�"></el-option>
+ <el-option label="瀹㈡湇閮�"
+ value="瀹㈡湇閮�"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="鑱屼綅" prop="position">
- <el-input v-model="form.position" placeholder="璇疯緭鍏ヨ亴浣�"></el-input>
+ <el-form-item label="鑱屼綅"
+ prop="position">
+ <el-input v-model="form.position"
+ placeholder="璇疯緭鍏ヨ亴浣�"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="鍏ヨ亴鏃ユ湡" prop="hireDate">
- <el-date-picker
- v-model="form.hireDate"
- type="date"
- placeholder="閫夋嫨鍏ヨ亴鏃ユ湡"
- style="width: 100%"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- />
+ <el-form-item label="鍏ヨ亴鏃ユ湡"
+ prop="hireDate">
+ <el-date-picker v-model="form.hireDate"
+ type="date"
+ placeholder="閫夋嫨鍏ヨ亴鏃ユ湡"
+ style="width: 100%"
+ format="YYYY-MM-DD"
+ value-format="YYYY-MM-DD" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="鐘舵��" prop="status">
- <el-select v-model="form.status" placeholder="璇烽�夋嫨鐘舵��" style="width: 100%">
- <el-option label="鍦ㄨ亴" value="鍦ㄨ亴"></el-option>
- <el-option label="绂昏亴" value="绂昏亴"></el-option>
- <el-option label="璇曠敤鏈�" value="璇曠敤鏈�"></el-option>
+ <el-form-item label="鐘舵��"
+ prop="status">
+ <el-select v-model="form.status"
+ placeholder="璇烽�夋嫨鐘舵��"
+ style="width: 100%">
+ <el-option label="鍦ㄨ亴"
+ value="鍦ㄨ亴"></el-option>
+ <el-option label="绂昏亴"
+ value="绂昏亴"></el-option>
+ <el-option label="璇曠敤鏈�"
+ value="璇曠敤鏈�"></el-option>
</el-select>
</el-form-item>
</el-col>
@@ -149,14 +210,16 @@
</el-form>
<template #footer>
<div class="dialog-footer">
+ <el-button type="primary"
+ @click="handleSubmit">纭� 瀹�</el-button>
<el-button @click="dialogVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="handleSubmit">纭� 瀹�</el-button>
</div>
</template>
</el-dialog>
-
<!-- 鏉冮檺璁剧疆瀵硅瘽妗� -->
- <el-dialog v-model="permissionDialogVisible" title="鏉冮檺璁剧疆" width="500px">
+ <el-dialog v-model="permissionDialogVisible"
+ title="鏉冮檺璁剧疆"
+ width="500px">
<el-form label-width="100px">
<el-form-item label="涓氬姟鍛樺鍚�">
<span>{{ currentSalesperson.name }}</span>
@@ -174,8 +237,9 @@
</el-form>
<template #footer>
<div class="dialog-footer">
+ <el-button type="primary"
+ @click="savePermissions">纭� 瀹�</el-button>
<el-button @click="permissionDialogVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="savePermissions">纭� 瀹�</el-button>
</div>
</template>
</el-dialog>
@@ -183,200 +247,201 @@
</template>
<script setup>
-import { ref, reactive, computed,onMounted } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import {listPage,add,update,deleteSalespersonManagement} from '@/api/salesManagement/salespersonManagement.js'
-import { Plus, Search } from '@element-plus/icons-vue'
-import Pagination from '@/components/PIMTable/Pagination.vue'
+ import { ref, reactive, computed, onMounted } from "vue";
+ import { ElMessage, ElMessageBox } from "element-plus";
+ import {
+ listPage,
+ add,
+ update,
+ deleteSalespersonManagement,
+ } from "@/api/salesManagement/salespersonManagement.js";
+ import { Plus, Search } from "@element-plus/icons-vue";
+ import Pagination from "@/components/PIMTable/Pagination.vue";
-const salespersonList = ref([])
-const total = ref(0)
+ const salespersonList = ref([]);
+ const total = ref(0);
-onMounted(() => {
- getList()
-})
-const getList = () => {
- loading.value = true
- listPage({...pagination,...searchForm}).then(res => {
- salespersonList.value = res.data.records
- total.value = res.data.total
- loading.value = false
- })
-}
+ onMounted(() => {
+ getList();
+ });
+ const getList = () => {
+ loading.value = true;
+ listPage({ ...pagination, ...searchForm }).then(res => {
+ salespersonList.value = res.data.records;
+ total.value = res.data.total;
+ loading.value = false;
+ });
+ };
-// 鍝嶅簲寮忔暟鎹�
-const loading = ref(false)
-const searchForm = reactive({
- name: '',
- department: '',
- status: ''
-})
+ // 鍝嶅簲寮忔暟鎹�
+ const loading = ref(false);
+ const searchForm = reactive({
+ name: "",
+ department: "",
+ status: "",
+ });
+ const pagination = reactive({
+ current: 1,
+ size: 10,
+ });
+ const dialogVisible = ref(false);
+ const dialogTitle = ref("鏂板涓氬姟鍛�");
+ const form = reactive({
+ name: "",
+ phone: "",
+ email: "",
+ department: "",
+ position: "",
+ hireDate: "",
+ status: "鍦ㄨ亴",
+ });
-const pagination = reactive({
- current: 1,
- size: 10
-})
+ const rules = {
+ name: [{ required: true, message: "璇疯緭鍏ュ鍚�", trigger: "blur" }],
+ phone: [{ required: true, message: "璇疯緭鍏ヨ仈绯荤數璇�", trigger: "blur" }],
+ email: [{ required: true, message: "璇疯緭鍏ラ偖绠�", trigger: "blur" }],
+ department: [{ required: true, message: "璇烽�夋嫨閮ㄩ棬", trigger: "change" }],
+ position: [{ required: true, message: "璇疯緭鍏ヨ亴浣�", trigger: "blur" }],
+ hireDate: [{ required: true, message: "璇烽�夋嫨鍏ヨ亴鏃ユ湡", trigger: "change" }],
+ status: [{ required: true, message: "璇烽�夋嫨鐘舵��", trigger: "change" }],
+ };
-const dialogVisible = ref(false)
-const dialogTitle = ref('鏂板涓氬姟鍛�')
-const form = reactive({
- name: '',
- phone: '',
- email: '',
- department: '',
- position: '',
- hireDate: '',
- status: '鍦ㄨ亴'
-})
+ const isEdit = ref(false);
+ const editId = ref(null);
+ const permissionDialogVisible = ref(false);
+ const currentSalesperson = ref({});
+ const currentPermissions = ref([]);
+ const formRef = ref();
-const rules = {
- name: [{ required: true, message: '璇疯緭鍏ュ鍚�', trigger: 'blur' }],
- phone: [{ required: true, message: '璇疯緭鍏ヨ仈绯荤數璇�', trigger: 'blur' }],
- email: [{ required: true, message: '璇疯緭鍏ラ偖绠�', trigger: 'blur' }],
- department: [{ required: true, message: '璇烽�夋嫨閮ㄩ棬', trigger: 'change' }],
- position: [{ required: true, message: '璇疯緭鍏ヨ亴浣�', trigger: 'blur' }],
- hireDate: [{ required: true, message: '璇烽�夋嫨鍏ヨ亴鏃ユ湡', trigger: 'change' }],
- status: [{ required: true, message: '璇烽�夋嫨鐘舵��', trigger: 'change' }]
-}
-
-const isEdit = ref(false)
-const editId = ref(null)
-const permissionDialogVisible = ref(false)
-const currentSalesperson = ref({})
-const currentPermissions = ref([])
-const formRef = ref()
-
-// 璁$畻灞炴��
-const filteredList = computed(() => {
- let list = salespersonList.value
- if (searchForm.name) {
- list = list.filter(item => item.name.includes(searchForm.name))
- }
- if (searchForm.department) {
- list = list.filter(item => item.department === searchForm.department)
- }
- if (searchForm.status) {
- list = list.filter(item => item.status === searchForm.status)
- }
- return list
-})
-
-// 鏂规硶
-const getStatusType = (status) => {
- const statusMap = {
- '鍦ㄨ亴': 'success',
- '绂昏亴': 'danger',
- '璇曠敤鏈�': 'warning'
- }
- return statusMap[status] || 'info'
-}
-
-const handleSearch = () => {
- getList()
- // 鎼滅储閫昏緫宸插湪computed涓鐞�
-}
-
-const resetSearch = () => {
- searchForm.name = ''
- searchForm.department = ''
- searchForm.status = ''
-}
-
-const handleAdd = () => {
- dialogTitle.value = '鏂板涓氬姟鍛�'
- isEdit.value = false
- form.name = ''
- form.phone = ''
- form.email = ''
- form.department = ''
- form.position = ''
- form.hireDate = ''
- form.status = '鍦ㄨ亴'
- dialogVisible.value = true
-}
-
-const handleEdit = (row) => {
- dialogTitle.value = '缂栬緫涓氬姟鍛�'
- isEdit.value = true
- editId.value = row.id
- Object.assign(form, row)
- dialogVisible.value = true
-}
-
-const handleDelete = (row) => {
- ElMessageBox.confirm('纭鍒犻櫎璇ヤ笟鍔″憳鍚楋紵', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- let ids = [row.id]
- deleteSalespersonManagement(ids).then(res => {
- if(res.code === 200){
- ElMessage.success('鍒犻櫎鎴愬姛')
- getList()
- }
- })
- })
-}
-
-const handlePermissions = (row) => {
- currentSalesperson.value = row
- currentPermissions.value = row.permissions.split(",")
- permissionDialogVisible.value = true
-}
-
-const savePermissions = () => {
- let splice = currentPermissions.value;
- if(splice[0] === ''){
- splice.splice(0,1)
- }
- currentSalesperson.value.permissions = splice.join(",")
- update(currentSalesperson.value).then(res => {
- if(res.code === 200){
- ElMessage.success('鏉冮檺璁剧疆鎴愬姛')
- permissionDialogVisible.value = false
- getList()
+ // 璁$畻灞炴��
+ const filteredList = computed(() => {
+ let list = salespersonList.value;
+ if (searchForm.name) {
+ list = list.filter(item => item.name.includes(searchForm.name));
}
- })
-}
-
-const handleSubmit = () => {
- formRef.value.validate((valid) => {
- if (valid) {
- if (isEdit.value) {
- // 缂栬緫
- update(form).then(res => {
- if(res.code === 200){
- ElMessage.success('缂栬緫鎴愬姛')
- dialogVisible.value = false
- getList()
- }
- })
- } else {
- add(form).then(res => {
- if(res.code === 200){
- ElMessage.success('鏂板鎴愬姛')
- dialogVisible.value = false
- getList()
- }
- })
-
- }
-
+ if (searchForm.department) {
+ list = list.filter(item => item.department === searchForm.department);
}
- })
-}
+ if (searchForm.status) {
+ list = list.filter(item => item.status === searchForm.status);
+ }
+ return list;
+ });
-const handleCurrentChange = (val) => {
- pagination.value.currentPage = val.page
- pagination.value.pageSize = val.limit
-}
+ // 鏂规硶
+ const getStatusType = status => {
+ const statusMap = {
+ 鍦ㄨ亴: "success",
+ 绂昏亴: "danger",
+ 璇曠敤鏈�: "warning",
+ };
+ return statusMap[status] || "info";
+ };
+
+ const handleSearch = () => {
+ getList();
+ // 鎼滅储閫昏緫宸插湪computed涓鐞�
+ };
+
+ const resetSearch = () => {
+ searchForm.name = "";
+ searchForm.department = "";
+ searchForm.status = "";
+ };
+
+ const handleAdd = () => {
+ dialogTitle.value = "鏂板涓氬姟鍛�";
+ isEdit.value = false;
+ form.name = "";
+ form.phone = "";
+ form.email = "";
+ form.department = "";
+ form.position = "";
+ form.hireDate = "";
+ form.status = "鍦ㄨ亴";
+ dialogVisible.value = true;
+ };
+
+ const handleEdit = row => {
+ dialogTitle.value = "缂栬緫涓氬姟鍛�";
+ isEdit.value = true;
+ editId.value = row.id;
+ Object.assign(form, row);
+ dialogVisible.value = true;
+ };
+
+ const handleDelete = row => {
+ ElMessageBox.confirm("纭鍒犻櫎璇ヤ笟鍔″憳鍚楋紵", "鎻愮ず", {
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ }).then(() => {
+ let ids = [row.id];
+ deleteSalespersonManagement(ids).then(res => {
+ if (res.code === 200) {
+ ElMessage.success("鍒犻櫎鎴愬姛");
+ getList();
+ }
+ });
+ });
+ };
+
+ const handlePermissions = row => {
+ currentSalesperson.value = row;
+ currentPermissions.value = row.permissions.split(",");
+ permissionDialogVisible.value = true;
+ };
+
+ const savePermissions = () => {
+ let splice = currentPermissions.value;
+ if (splice[0] === "") {
+ splice.splice(0, 1);
+ }
+ currentSalesperson.value.permissions = splice.join(",");
+ update(currentSalesperson.value).then(res => {
+ if (res.code === 200) {
+ ElMessage.success("鏉冮檺璁剧疆鎴愬姛");
+ permissionDialogVisible.value = false;
+ getList();
+ }
+ });
+ };
+
+ const handleSubmit = () => {
+ formRef.value.validate(valid => {
+ if (valid) {
+ if (isEdit.value) {
+ // 缂栬緫
+ update(form).then(res => {
+ if (res.code === 200) {
+ ElMessage.success("缂栬緫鎴愬姛");
+ dialogVisible.value = false;
+ getList();
+ }
+ });
+ } else {
+ add(form).then(res => {
+ if (res.code === 200) {
+ ElMessage.success("鏂板鎴愬姛");
+ dialogVisible.value = false;
+ getList();
+ }
+ });
+ }
+ }
+ });
+ };
+
+ const handleCurrentChange = val => {
+ pagination.value.currentPage = val.page;
+ pagination.value.pageSize = val.limit;
+ };
</script>
<style scoped>
-.search-row {
- margin-bottom: 20px;
-}
+ .search-row {
+ margin-bottom: 20px;
+ }
</style>
--
Gitblit v1.9.3