diff --git a/attendance-performance-manager-ui/admin/src/router.js b/attendance-performance-manager-ui/admin/src/router.js
index dac8aadf006814e305c4fa54ce1ba48edf79c96b..f2a1ecdf8043d703b0a34a6a1f158f1219a348c3 100644
--- a/attendance-performance-manager-ui/admin/src/router.js
+++ b/attendance-performance-manager-ui/admin/src/router.js
@@ -40,6 +40,21 @@ const router = new Router({
 
                 //閮ㄩ棬
                 ...restBuilder('dept', 'dept'),
+                ...restBuilder('staff', 'staff'),//鑺卞悕鍐� 鍛樺伐淇℃伅
+                ...restBuilder('staff/care', 'staff/care'),// 鍛樺伐鍏虫€€淇℃伅
+                ...restBuilder('care/template', 'care/template'),// 鍏虫€€闂€欎俊鎭�
+                ...restBuilder('job', 'job'),// 鑱屼綅淇℃伅
+                ...restBuilder('staff/black', 'staff/black'),// 鍛樺伐榛戝悕鍗曚俊鎭�
+                ...restBuilder('staff/adjust/log', 'staff/adjust/log'),// 鍛樺伐璋冨矖淇℃伅
+                ...restBuilder('staff/regular', 'staff/regular'),// 鍛樺伐杞淇℃伅
+                ...restBuilder('staff/leave', 'staff/leave'),// 鍛樺伐绂昏亴淇℃伅
+                ...restBuilder('staff/contract', 'staff/contract'),// 鍛樺伐鍚堝悓淇℃伅
+                ...restBuilder('attendance/record', 'attendance/record'),// 鑰冨嫟鎵撳崱璁板綍淇℃伅
+                ...restBuilder('attendance/record/detail', 'attendance/record/detail'),// 鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅
+                ...restBuilder('attendance/group', 'attendance/group'),// 鑰冨嫟缁勪俊鎭�
+                ...restBuilder('attendance/class', 'attendance/class'),// 鑰冨嫟鐝淇℃伅
+                ...restBuilder('attendance/leave/record', 'attendance/leave/record'),// 璇峰亣璁板綍淇℃伅
+                ...restBuilder('attendance/vacation/balance', 'attendance/vacation/balance'),// 鍛樺伐鍋囨湡浣欓淇℃伅
 
 
                 //浠ヤ笅涓哄熀纭€璺敱閰嶇疆
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/class/detail/dialogshow.vue b/attendance-performance-manager-ui/admin/src/views/attendance/class/detail/dialogshow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..db9ca9d0008365553d5e0998e0b5532861afc870
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/class/detail/dialogshow.vue
@@ -0,0 +1,116 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-dialog :title="title" :visible.sync="open" width="90%" append-to-body>
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鐝ID" prop="shiftsId" v-model="form.shiftsId" placeholder="璇疯緭鍏ョ彮娆D"/>
+                            <Field label="鐝鍚嶇О" prop="shiftsName" v-model="form.shiftsName" placeholder="璇疯緭鍏ョ彮娆″悕绉�"/>
+                            <Field label="涓婄彮鎵撳崱鏃堕棿" prop="goWorkDate" v-model="form.goWorkDate" type="date" />
+                            <Field label="涓婄彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" prop="goWorkDateBefore" v-model="form.goWorkDateBefore" placeholder="璇疯緭鍏ヤ笂鐝墦鍗″墠鏃堕棿娈�,鍗曚綅鍒嗛挓"/>
+                            <Field label="涓婄彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" prop="goWorkDateAfter" v-model="form.goWorkDateAfter" placeholder="璇疯緭鍏ヤ笂鐝墦鍗″墠鏃堕棿娈�,鍗曚綅鍒嗛挓"/>
+                            <Field label="涓嬬彮鎵撳崱鏃堕棿" prop="offWorkDate" v-model="form.offWorkDate" type="date" />
+                            <Field label="涓嬬彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" prop="offWorkDateBefore" v-model="form.offWorkDateBefore" placeholder="璇疯緭鍏ヤ笅鐝墦鍗″墠鏃堕棿娈�,鍗曚綅鍒嗛挓"/>
+                            <Field label="涓嬬彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" prop="offWorkDateAfter" v-model="form.offWorkDateAfter" placeholder="璇疯緭鍏ヤ笅鐝墦鍗″墠鏃堕棿娈�,鍗曚綅鍒嗛挓"/>
+                            <Field label="澶囨敞" prop="remark" v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+
+            </el-row>
+
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button type="primary" v-if="pageInfo.type !== 'view'" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    import dialogShow from "./dialogshow";
+    export default {
+        mixins: [form],
+        components: {
+            dialogShow ,
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鑰冨嫟鐝璇︾粏淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                toString:[
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/class/detail/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鑰冨嫟鐝璇︾粏淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "attendance/class/detail/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鑰冨嫟鐝璇︾粏淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/class/detail/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鑰冨嫟鐝璇︾粏淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    shiftsId : null,
+                    shiftsName : "",
+                    goWorkDate : null,
+                    goWorkDateBefore : null,
+                    goWorkDateAfter : null,
+                    offWorkDate : null,
+                    offWorkDateBefore : null,
+                    offWorkDateAfter : null,
+                    remark : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/class/detail/drawershow.vue b/attendance-performance-manager-ui/admin/src/views/attendance/class/detail/drawershow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..cc33032ea61f12b192a421ce86f0399ce2e41b43
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/class/detail/drawershow.vue
@@ -0,0 +1,126 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-drawer
+            :title="title"
+            :visible.sync="open"
+            :direction="direction"
+            size="50%">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鐝ID" prop="shiftsId" v-model="form.shiftsId" placeholder="璇疯緭鍏ョ彮娆D"/>
+                            <Field label="鐝鍚嶇О" prop="shiftsName" v-model="form.shiftsName" placeholder="璇疯緭鍏ョ彮娆″悕绉�"/>
+                            <Field label="涓婄彮鎵撳崱鏃堕棿" prop="goWorkDate" v-model="form.goWorkDate" type="date" />
+                            <Field label="涓婄彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" prop="goWorkDateBefore" v-model="form.goWorkDateBefore" placeholder="璇疯緭鍏ヤ笂鐝墦鍗″墠鏃堕棿娈�,鍗曚綅鍒嗛挓"/>
+                            <Field label="涓婄彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" prop="goWorkDateAfter" v-model="form.goWorkDateAfter" placeholder="璇疯緭鍏ヤ笂鐝墦鍗″墠鏃堕棿娈�,鍗曚綅鍒嗛挓"/>
+                            <Field label="涓嬬彮鎵撳崱鏃堕棿" prop="offWorkDate" v-model="form.offWorkDate" type="date" />
+                            <Field label="涓嬬彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" prop="offWorkDateBefore" v-model="form.offWorkDateBefore" placeholder="璇疯緭鍏ヤ笅鐝墦鍗″墠鏃堕棿娈�,鍗曚綅鍒嗛挓"/>
+                            <Field label="涓嬬彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" prop="offWorkDateAfter" v-model="form.offWorkDateAfter" placeholder="璇疯緭鍏ヤ笅鐝墦鍗″墠鏃堕棿娈�,鍗曚綅鍒嗛挓"/>
+                            <Field label="澶囨敞" prop="remark" v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+
+            </el-row>
+
+            <form-buttons @submit='submitForm' noCancelBtn />
+        </el-form>
+
+    </el-drawer>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    export default {
+        name: "AttendanceClassDetailDetail",
+        mixins: [form],
+        components: {
+
+        },
+        created() {
+            this.changePath("attendance/class/detail")
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鑰冨嫟鐝璇︾粏淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                direction:"rtl",
+                toString:[
+                ],
+                toDate:[
+                    "goWorkDate",
+                    "offWorkDate",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/class/detail/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鑰冨嫟鐝璇︾粏淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "attendance/class/detail/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鑰冨嫟鐝璇︾粏淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/class/detail/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鑰冨嫟鐝璇︾粏淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    shiftsId : null,
+                    shiftsName : "",
+                    goWorkDate : null,
+                    goWorkDateBefore : null,
+                    goWorkDateAfter : null,
+                    offWorkDate : null,
+                    offWorkDateBefore : null,
+                    offWorkDateAfter : null,
+                    remark : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/class/detail/list.vue b/attendance-performance-manager-ui/admin/src/views/attendance/class/detail/list.vue
new file mode 100644
index 0000000000000000000000000000000000000000..0b875be5dfb714c752fb3c8aee5dd36a1a837ab1
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/class/detail/list.vue
@@ -0,0 +1,66 @@
+<template>
+    <div class="page">
+        <LayoutTable :data="tableData" :config="tableConfig">
+                    </LayoutTable>
+
+
+        <drawer-show ref="drawerform" @ok="getData" />
+    </div>
+</template>
+
+<script>
+    /** 琛ㄥ崟寮瑰嚭妗嗘ā寮忛渶寮曞叆 */
+    import drawerShow from "./drawershow";
+    import table from "@/assets/mixins/table";
+    export default {
+        name: "AttendanceClassDetailList",
+        components: {
+            drawerShow
+},
+        mixins: [table],
+        created() {
+        },
+        methods: {
+            /** 閲嶅啓鏂板鏂规硶 */
+            toAdd(row) {
+                this.$refs.drawerform.add(row);
+            },
+            /** 閲嶅啓缂栬緫鏂规硶 */
+            toEdit(row) {
+                this.$refs.drawerform.edit(row);
+            },
+            /** 閲嶅啓鏌ョ湅鏂规硶 */
+            toView(row) {
+                this.$refs.drawerform.view(row);
+            },
+
+        },
+        data() {
+            return {
+                config: {
+                    search: [
+                    ],
+                    columns: [
+                        {type: "selection", width: 60},
+                        {type: "index",label: "搴忓彿",width: 50},
+
+                        {label: "涓婄彮鎵撳崱鏃堕棿", prop: "goWorkDate", formatter: this.formatterDate},
+
+                        {label: "涓嬬彮鎵撳崱鏃堕棿", prop: "offWorkDate", formatter: this.formatterDate},
+
+                        {label: "鍒涘缓鐢ㄦ埛", prop: "createUserId", formatter: this.formatter},
+                        {
+                            label: "鎿嶄綔",
+                            width: 240,
+                            formatter: row => {
+                                return (
+                                    <table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
+                            );
+                            }
+                        }
+                    ]
+                }
+            };
+        }
+    };
+</script>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/class/detail/view.vue b/attendance-performance-manager-ui/admin/src/views/attendance/class/detail/view.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f205d3460a1a6259a07f2e75402271c82cbdca51
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/class/detail/view.vue
@@ -0,0 +1,81 @@
+<template>
+    <layout-view>
+        <el-descriptions  :title="title" :column="column" :size="size" :colon="false" border>
+            <template slot="title">
+                <i class="el-icon-tickets"></i>
+                鍩烘湰璇︾粏淇℃伅
+            </template>
+            <template slot="extra">
+                <el-button type="primary" @click="$router.go(-1)" size="small">杩斿洖</el-button>
+            </template>
+                                    <el-descriptions-item label="鐝ID" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.shiftsId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鐝鍚嶇О" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.shiftsName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="涓婄彮鎵撳崱鏃堕棿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.goWorkDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="涓婄彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.goWorkDateBefore}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="涓婄彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.goWorkDateAfter}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="涓嬬彮鎵撳崱鏃堕棿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.offWorkDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="涓嬬彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.offWorkDateBefore}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="涓嬬彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.offWorkDateAfter}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="澶囨敞" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.remark}}
+                        </el-descriptions-item>
+        </el-descriptions>
+
+    </layout-view>
+</template>
+
+<script>
+    import view from "@/assets/mixins/view";
+    export default {
+        mixins: [view],
+        components: {
+        },
+        methods: {
+
+        },
+        data() {
+            return {
+                size:"small",
+                column:2,
+                toString:[
+                ],
+                toArrays: [
+
+                ],
+                toDate: [
+
+                ]
+            }
+        }
+    }
+</script>
+<style lang="less">
+    .labelClass{
+        width: 200px;
+    }
+    .el-descriptions__body{
+        margin-left: 5px;
+        margin-right: 5px;
+        color: #606266;
+        background-color: #FFF;
+    }
+    .contentClass{
+        width: 600px;
+    }
+</style>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/class/dialogshow.vue b/attendance-performance-manager-ui/admin/src/views/attendance/class/dialogshow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..8e431eebbfb000890a823153c95f2ca3f1475e88
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/class/dialogshow.vue
@@ -0,0 +1,230 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-dialog :title="title" :visible.sync="open" width="90%" append-to-body>
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鐝鍚嶇О" prop="className" v-model="form.className" placeholder="璇疯緭鍏ョ彮娆″悕绉�"/>
+                            <Field label="鐝璐熻矗浜篒D" prop="classResponsiblePersonId" v-model="form.classResponsiblePersonId" placeholder="璇疯緭鍏ョ彮娆¤礋璐d汉ID"/>
+                            <Field label="鐝璐熻矗浜哄悕绉�" prop="classResponsiblePersonName" v-model="form.classResponsiblePersonName" placeholder="璇疯緭鍏ョ彮娆¤礋璐d汉鍚嶇О"/>
+                            <Field label="澶囨敞" prop="remark" v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+
+            </el-row>
+                <el-divider content-position="center">鑰冨嫟鐝璇︾粏淇℃伅淇℃伅</el-divider>
+                <br/>
+                <el-row :gutter="10" class="mb8">
+                    <el-col :span="1.5">
+                        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAddAttendanceClassDetail">娣诲姞</el-button>
+                    </el-col>
+                    <el-col :span="1.5">
+                        <el-button type="danger" icon="el-icon-delete" size="mini" @click="handleDeleteAttendanceClassDetail">鍒犻櫎</el-button>
+                    </el-col>
+                </el-row>
+
+                <el-table :data="attendanceClassDetailList" :row-class-name="rowAttendanceClassDetailIndex" @selection-change="handleAttendanceClassDetailSelectionChange" ref="attendanceClassDetail">
+                    <el-table-column type="selection" width="50" align="center" />
+                    <el-table-column label="搴忓彿" align="center" prop="index" width="50"/>
+                            <el-table-column label="鐝鍚嶇О" prop="shiftsName">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.shiftsName" placeholder="璇疯緭鍏ョ彮娆″悕绉�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓婄彮鎵撳崱鏃堕棿" prop="goWorkDate">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.goWorkDate" placeholder="璇疯緭鍏ヤ笂鐝墦鍗℃椂闂�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓婄彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" prop="goWorkDateBefore">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.goWorkDateBefore" placeholder="璇疯緭鍏ヤ笂鐝墦鍗″墠鏃堕棿娈�,鍗曚綅鍒嗛挓" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓婄彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" prop="goWorkDateAfter">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.goWorkDateAfter" placeholder="璇疯緭鍏ヤ笂鐝墦鍗″墠鏃堕棿娈�,鍗曚綅鍒嗛挓" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓嬬彮鎵撳崱鏃堕棿" prop="offWorkDate">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.offWorkDate" placeholder="璇疯緭鍏ヤ笅鐝墦鍗℃椂闂�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓嬬彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" prop="offWorkDateBefore">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.offWorkDateBefore" placeholder="璇疯緭鍏ヤ笅鐝墦鍗″墠鏃堕棿娈�,鍗曚綅鍒嗛挓" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓嬬彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" prop="offWorkDateAfter">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.offWorkDateAfter" placeholder="璇疯緭鍏ヤ笅鐝墦鍗″墠鏃堕棿娈�,鍗曚綅鍒嗛挓" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="澶囨敞" prop="remark">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.remark" placeholder="璇疯緭鍏ュ娉�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="鍒涘缓鐢ㄦ埛" prop="createUserId">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.createUserId" placeholder="璇疯緭鍏ュ垱寤虹敤鎴�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="鍒涘缓鏃堕棿" prop="createTime">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.createTime" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="鏇存柊鐢ㄦ埛" prop="updateUserId">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.updateUserId" placeholder="璇疯緭鍏ユ洿鏂扮敤鎴�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="鏇存柊鏃堕棿" prop="updateTime">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.updateTime" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" />
+                                </template>
+                            </el-table-column>
+                </el-table>
+
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button type="primary" v-if="pageInfo.type !== 'view'" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    import dialogShow from "./dialogshow";
+    export default {
+        mixins: [form],
+        components: {
+            dialogShow ,
+        },
+        data() {
+            return {
+                // 瀛愯〃閫変腑鏁版嵁
+                checkedAttendanceClassDetail: [],
+                // 鑰冨嫟鐝璇︾粏淇℃伅琛ㄦ牸鏁版嵁
+                attendanceClassDetailList: [],
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鑰冨嫟鐝淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                toString:[
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 鑰冨嫟鐝璇︾粏淇℃伅搴忓彿 */
+            rowAttendanceClassDetailIndex({ row, rowIndex }) {
+                row.index = rowIndex + 1;
+            },
+            /** 鑰冨嫟鐝璇︾粏淇℃伅娣诲姞鎸夐挳鎿嶄綔 */
+            handleAddAttendanceClassDetail() {
+                let obj = {};
+                obj.shiftsName = "";
+                obj.goWorkDate = "";
+                obj.goWorkDateBefore = "";
+                obj.goWorkDateAfter = "";
+                obj.offWorkDate = "";
+                obj.offWorkDateBefore = "";
+                obj.offWorkDateAfter = "";
+                obj.remark = "";
+                obj.createUserId = "";
+                obj.createTime = "";
+                obj.updateUserId = "";
+                obj.updateTime = "";
+                this.attendanceClassDetailList.push(obj);
+            },
+            /** 鑰冨嫟鐝璇︾粏淇℃伅鍒犻櫎鎸夐挳鎿嶄綔 */
+            handleDeleteAttendanceClassDetail() {
+                if (this.checkedAttendanceClassDetail.length == 0) {
+                    this.$alert("璇峰厛閫夋嫨瑕佸垹闄ょ殑鑰冨嫟鐝璇︾粏淇℃伅鏁版嵁", "鎻愮ず", { confirmButtonText: "纭畾", });
+                } else {
+                    this.attendanceClassDetailList.splice(this.checkedAttendanceClassDetail[0].index - 1, 1);
+                }
+            },
+            /** 鍗曢€夋閫変腑鏁版嵁 */
+            handleAttendanceClassDetailSelectionChange(selection) {
+                if (selection.length > 1) {
+                    this.$refs.attendanceClassDetail.clearSelection();
+                    this.$refs.attendanceClassDetail.toggleRowSelection(selection.pop());
+                } else {
+                    this.checkedAttendanceClassDetail = selection;
+                }
+            },
+            // 娓叉煋鍓嶇疆澶勭悊
+            beforeRender(data) {
+                if(data.entity.attendanceClassDetailList) {
+                    this.attendanceClassDetailList = data.entity.attendanceClassDetailList;
+                }
+                return data
+            },
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/class/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鑰冨嫟鐝淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "attendance/class/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鑰冨嫟鐝淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/class/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鑰冨嫟鐝淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    className : "",
+                    classResponsiblePersonId : null,
+                    classResponsiblePersonName : "",
+                    remark : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/class/drawershow.vue b/attendance-performance-manager-ui/admin/src/views/attendance/class/drawershow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..cb7a8d0d181ce19128d34a6d211fb5692750300d
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/class/drawershow.vue
@@ -0,0 +1,238 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-drawer
+            :title="title"
+            :visible.sync="open"
+            :direction="direction"
+            size="50%">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鐝鍚嶇О" prop="className" v-model="form.className" placeholder="璇疯緭鍏ョ彮娆″悕绉�"/>
+                            <Field label="鐝璐熻矗浜篒D" prop="classResponsiblePersonId" v-model="form.classResponsiblePersonId" placeholder="璇疯緭鍏ョ彮娆¤礋璐d汉ID"/>
+                            <Field label="鐝璐熻矗浜哄悕绉�" prop="classResponsiblePersonName" v-model="form.classResponsiblePersonName" placeholder="璇疯緭鍏ョ彮娆¤礋璐d汉鍚嶇О"/>
+                            <Field label="澶囨敞" prop="remark" v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+
+            </el-row>
+                <el-divider content-position="center">鑰冨嫟鐝璇︾粏淇℃伅淇℃伅</el-divider>
+                <br/>
+                <el-row :gutter="10" class="mb8">
+                    <el-col :span="1.5">
+                        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAddAttendanceClassDetail">娣诲姞</el-button>
+                    </el-col>
+                    <el-col :span="1.5">
+                        <el-button type="danger" icon="el-icon-delete" size="mini" @click="handleDeleteAttendanceClassDetail">鍒犻櫎</el-button>
+                    </el-col>
+                </el-row>
+
+                <el-table :data="attendanceClassDetailList" :row-class-name="rowAttendanceClassDetailIndex" @selection-change="handleAttendanceClassDetailSelectionChange" ref="attendanceClassDetail">
+                    <el-table-column type="selection" width="50" align="center" />
+                    <el-table-column label="搴忓彿" align="center" prop="index" width="50"/>
+                            <el-table-column label="鐝鍚嶇О" prop="shiftsName">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.shiftsName" placeholder="璇疯緭鍏ョ彮娆″悕绉�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓婄彮鎵撳崱鏃堕棿" prop="goWorkDate">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.goWorkDate" placeholder="璇疯緭鍏ヤ笂鐝墦鍗℃椂闂�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓婄彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" prop="goWorkDateBefore">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.goWorkDateBefore" placeholder="璇疯緭鍏ヤ笂鐝墦鍗″墠鏃堕棿娈�,鍗曚綅鍒嗛挓" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓婄彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" prop="goWorkDateAfter">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.goWorkDateAfter" placeholder="璇疯緭鍏ヤ笂鐝墦鍗″墠鏃堕棿娈�,鍗曚綅鍒嗛挓" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓嬬彮鎵撳崱鏃堕棿" prop="offWorkDate">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.offWorkDate" placeholder="璇疯緭鍏ヤ笅鐝墦鍗℃椂闂�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓嬬彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" prop="offWorkDateBefore">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.offWorkDateBefore" placeholder="璇疯緭鍏ヤ笅鐝墦鍗″墠鏃堕棿娈�,鍗曚綅鍒嗛挓" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓嬬彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓" prop="offWorkDateAfter">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.offWorkDateAfter" placeholder="璇疯緭鍏ヤ笅鐝墦鍗″墠鏃堕棿娈�,鍗曚綅鍒嗛挓" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="澶囨敞" prop="remark">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.remark" placeholder="璇疯緭鍏ュ娉�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="鍒涘缓鐢ㄦ埛" prop="createUserId">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.createUserId" placeholder="璇疯緭鍏ュ垱寤虹敤鎴�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="鍒涘缓鏃堕棿" prop="createTime">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.createTime" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="鏇存柊鐢ㄦ埛" prop="updateUserId">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.updateUserId" placeholder="璇疯緭鍏ユ洿鏂扮敤鎴�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="鏇存柊鏃堕棿" prop="updateTime">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.updateTime" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" />
+                                </template>
+                            </el-table-column>
+                </el-table>
+
+            <form-buttons @submit='submitForm' noCancelBtn />
+        </el-form>
+
+    </el-drawer>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    export default {
+        name: "AttendanceClassDetail",
+        mixins: [form],
+        components: {
+
+        },
+        created() {
+            this.changePath("attendance/class")
+        },
+        data() {
+            return {
+                // 瀛愯〃閫変腑鏁版嵁
+                checkedAttendanceClassDetail: [],
+                // 鑰冨嫟鐝璇︾粏淇℃伅琛ㄦ牸鏁版嵁
+                attendanceClassDetailList: [],
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鑰冨嫟鐝淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                direction:"rtl",
+                toString:[
+                ],
+                toDate:[
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 鑰冨嫟鐝璇︾粏淇℃伅搴忓彿 */
+            rowAttendanceClassDetailIndex({ row, rowIndex }) {
+                row.index = rowIndex + 1;
+            },
+            /** 鑰冨嫟鐝璇︾粏淇℃伅娣诲姞鎸夐挳鎿嶄綔 */
+            handleAddAttendanceClassDetail() {
+                let obj = {};
+                obj.shiftsName = "";
+                obj.goWorkDate = "";
+                obj.goWorkDateBefore = "";
+                obj.goWorkDateAfter = "";
+                obj.offWorkDate = "";
+                obj.offWorkDateBefore = "";
+                obj.offWorkDateAfter = "";
+                obj.remark = "";
+                obj.createUserId = "";
+                obj.createTime = "";
+                obj.updateUserId = "";
+                obj.updateTime = "";
+                this.attendanceClassDetailList.push(obj);
+            },
+            /** 鑰冨嫟鐝璇︾粏淇℃伅鍒犻櫎鎸夐挳鎿嶄綔 */
+            handleDeleteAttendanceClassDetail() {
+                if (this.checkedAttendanceClassDetail.length == 0) {
+                    this.$alert("璇峰厛閫夋嫨瑕佸垹闄ょ殑鑰冨嫟鐝璇︾粏淇℃伅鏁版嵁", "鎻愮ず", { confirmButtonText: "纭畾", });
+                } else {
+                    this.attendanceClassDetailList.splice(this.checkedAttendanceClassDetail[0].index - 1, 1);
+                }
+            },
+            /** 鍗曢€夋閫変腑鏁版嵁 */
+            handleAttendanceClassDetailSelectionChange(selection) {
+                if (selection.length > 1) {
+                    this.$refs.attendanceClassDetail.clearSelection();
+                    this.$refs.attendanceClassDetail.toggleRowSelection(selection.pop());
+                } else {
+                    this.checkedAttendanceClassDetail = selection;
+                }
+            },
+            // 娓叉煋鍓嶇疆澶勭悊
+            beforeRender(data) {
+                if(data.entity.attendanceClassDetailList) {
+                    this.attendanceClassDetailList = data.entity.attendanceClassDetailList;
+                }
+                return data
+            },
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/class/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鑰冨嫟鐝淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "attendance/class/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鑰冨嫟鐝淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/class/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鑰冨嫟鐝淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    className : "",
+                    classResponsiblePersonId : null,
+                    classResponsiblePersonName : "",
+                    remark : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/class/list.vue b/attendance-performance-manager-ui/admin/src/views/attendance/class/list.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f9b754ae4fa22985cc7649515d64d8b3a2974c08
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/class/list.vue
@@ -0,0 +1,106 @@
+<template>
+    <div class="page">
+        <LayoutTable :data="tableData" :config="tableConfig">
+                    </LayoutTable>
+
+
+        <drawer-show ref="drawerform" @ok="getData" />
+    </div>
+</template>
+
+<script>
+    /** 琛ㄥ崟寮瑰嚭妗嗘ā寮忛渶寮曞叆 */
+    import drawerShow from "./drawershow";
+    import table from "@/assets/mixins/table";
+    export default {
+        name: "AttendanceClassList",
+        components: {
+            drawerShow
+},
+        mixins: [table],
+        created() {
+        },
+        methods: {
+            renderTable(tableData) {
+                return (
+                    <el-table stripe data={tableData} class="total-table">
+                    {this.columnSet.map((item) => this.renderTableColumn(item))}
+                    </el-table>
+                );
+            },
+            renderTableColumn(options) {
+                return (
+                    <el-table-column
+                        prop={options.prop}
+                        label={options.label}
+                        width={options.width}
+                    >
+                    </el-table-column>
+                 );
+            },
+            /** 閲嶅啓鏂板鏂规硶 */
+            toAdd(row) {
+                this.$refs.drawerform.add(row);
+            },
+            /** 閲嶅啓缂栬緫鏂规硶 */
+            toEdit(row) {
+                this.$refs.drawerform.edit(row);
+            },
+            /** 閲嶅啓鏌ョ湅鏂规硶 */
+            toView(row) {
+                this.$refs.drawerform.view(row);
+            },
+
+        },
+        data() {
+            return {
+                /** 瀛愯〃鍒楀厓绱� */
+                columnSet:[
+                    {prop:"shiftsId",label:"鐝ID",width:100},
+                    {prop:"shiftsName",label:"鐝鍚嶇О",width:100},
+                    {prop:"goWorkDate",label:"涓婄彮鎵撳崱鏃堕棿",width:100},
+                    {prop:"goWorkDateBefore",label:"涓婄彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓",width:100},
+                    {prop:"goWorkDateAfter",label:"涓婄彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓",width:100},
+                    {prop:"offWorkDate",label:"涓嬬彮鎵撳崱鏃堕棿",width:100},
+                    {prop:"offWorkDateBefore",label:"涓嬬彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓",width:100},
+                    {prop:"offWorkDateAfter",label:"涓嬬彮鎵撳崱鍓嶆椂闂存,鍗曚綅鍒嗛挓",width:100},
+                    {prop:"remark",label:"澶囨敞",width:100},
+                ],
+                config: {
+                    search: [
+                    ],
+                    columns: [
+                        {type: "selection", width: 60},
+                        {type: "index",label: "搴忓彿",width: 50},
+
+                        {label: "鍒涘缓鐢ㄦ埛", prop: "createUserId", formatter: this.formatter},
+                        {label: "鑰冨嫟鐝璇︾粏淇℃伅",
+                          width: 120,
+                          prop: "subColumns",
+                          formatter: (row) => {
+                              let widthsize = this.columnSet.reduce((pre, cur) => {
+                                  return pre + Number(cur.width);
+                              }, 50);
+                              return (
+                                  <el-popover placement="right" width={widthsize} trigger="click">
+                                      {this.renderTable(row.attendanceClassDetailList)}
+                                      <el-button type="text" slot="reference">璇︾粏</el-button>
+                                  </el-popover>
+                              );
+                          },
+                        },
+                        {
+                            label: "鎿嶄綔",
+                            width: 240,
+                            formatter: row => {
+                                return (
+                                    <table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
+                            );
+                            }
+                        }
+                    ]
+                }
+            };
+        }
+    };
+</script>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/class/view.vue b/attendance-performance-manager-ui/admin/src/views/attendance/class/view.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e780a649b1f4ef0b158d524d80d266a8f937c88c
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/class/view.vue
@@ -0,0 +1,66 @@
+<template>
+    <layout-view>
+        <el-descriptions  :title="title" :column="column" :size="size" :colon="false" border>
+            <template slot="title">
+                <i class="el-icon-tickets"></i>
+                鍩烘湰璇︾粏淇℃伅
+            </template>
+            <template slot="extra">
+                <el-button type="primary" @click="$router.go(-1)" size="small">杩斿洖</el-button>
+            </template>
+                                    <el-descriptions-item label="鐝鍚嶇О" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.className}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鐝璐熻矗浜篒D" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.classResponsiblePersonId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鐝璐熻矗浜哄悕绉�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.classResponsiblePersonName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="澶囨敞" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.remark}}
+                        </el-descriptions-item>
+        </el-descriptions>
+
+    </layout-view>
+</template>
+
+<script>
+    import view from "@/assets/mixins/view";
+    export default {
+        mixins: [view],
+        components: {
+        },
+        methods: {
+
+        },
+        data() {
+            return {
+                size:"small",
+                column:2,
+                toString:[
+                ],
+                toArrays: [
+
+                ],
+                toDate: [
+
+                ]
+            }
+        }
+    }
+</script>
+<style lang="less">
+    .labelClass{
+        width: 200px;
+    }
+    .el-descriptions__body{
+        margin-left: 5px;
+        margin-right: 5px;
+        color: #606266;
+        background-color: #FFF;
+    }
+    .contentClass{
+        width: 600px;
+    }
+</style>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/group/dialogshow.vue b/attendance-performance-manager-ui/admin/src/views/attendance/group/dialogshow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..3a4ce92628817e00e54815cbdc24856322a11268
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/group/dialogshow.vue
@@ -0,0 +1,112 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-dialog :title="title" :visible.sync="open" width="90%" append-to-body>
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鑰冨嫟缁勫悕绉�" prop="groupName" v-model="form.groupName" placeholder="璇疯緭鍏ヨ€冨嫟缁勫悕绉�"/>
+                            <Field label="浜烘暟" prop="personNum" v-model="form.personNum" placeholder="璇疯緭鍏ヤ汉鏁�"/>
+                            <Field label="璐熻矗浜�" prop="responsiblePerson" v-model="form.responsiblePerson" placeholder="璇疯緭鍏ヨ礋璐d汉"/>
+                            <Field label="绫诲瀷" prop="type" v-model="form.type" type="select" :enumData="dict.type" placeholder="璇烽€夋嫨绫诲瀷"/>
+                            <Field label="鑰冨嫟鏃堕棿" prop="attendanceTime" v-model="form.attendanceTime" type="select" :enumData="dict.attendanceTime" placeholder="璇烽€夋嫨鑰冨嫟鏃堕棿"/>
+                            <Field label="澶囨敞" prop="remark" v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+
+            </el-row>
+
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button type="primary" v-if="pageInfo.type !== 'view'" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    import dialogShow from "./dialogshow";
+    export default {
+        mixins: [form],
+        components: {
+            dialogShow ,
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鑰冨嫟缁勪俊鎭�",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                toString:[
+                    "type",
+                    "attendanceTime",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/group/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鑰冨嫟缁勪俊鎭�";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "attendance/group/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鑰冨嫟缁勪俊鎭�";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/group/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鑰冨嫟缁勪俊鎭缁�";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    groupName : "",
+                    personNum : null,
+                    responsiblePerson : "",
+                    type : null,
+                    attendanceTime : null,
+                    remark : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/group/drawershow.vue b/attendance-performance-manager-ui/admin/src/views/attendance/group/drawershow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..924297da7b7a07a359d79751b11012f818c22950
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/group/drawershow.vue
@@ -0,0 +1,120 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-drawer
+            :title="title"
+            :visible.sync="open"
+            :direction="direction"
+            size="50%">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鑰冨嫟缁勫悕绉�" prop="groupName" v-model="form.groupName" placeholder="璇疯緭鍏ヨ€冨嫟缁勫悕绉�"/>
+                            <Field label="浜烘暟" prop="personNum" v-model="form.personNum" placeholder="璇疯緭鍏ヤ汉鏁�"/>
+                            <Field label="璐熻矗浜�" prop="responsiblePerson" v-model="form.responsiblePerson" placeholder="璇疯緭鍏ヨ礋璐d汉"/>
+                            <Field label="绫诲瀷" prop="type" v-model="form.type" type="select" :enumData="dict.type" placeholder="璇烽€夋嫨绫诲瀷"/>
+                            <Field label="鑰冨嫟鏃堕棿" prop="attendanceTime" v-model="form.attendanceTime" type="select" :enumData="dict.attendanceTime" placeholder="璇烽€夋嫨鑰冨嫟鏃堕棿"/>
+                            <Field label="澶囨敞" prop="remark" v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+
+            </el-row>
+
+            <form-buttons @submit='submitForm' noCancelBtn />
+        </el-form>
+
+    </el-drawer>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    export default {
+        name: "AttendanceGroupDetail",
+        mixins: [form],
+        components: {
+
+        },
+        created() {
+            this.changePath("attendance/group")
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鑰冨嫟缁勪俊鎭�",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                direction:"rtl",
+                toString:[
+                    "type",
+                    "attendanceTime",
+                ],
+                toDate:[
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/group/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鑰冨嫟缁勪俊鎭�";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "attendance/group/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鑰冨嫟缁勪俊鎭�";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/group/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鑰冨嫟缁勪俊鎭缁�";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    groupName : "",
+                    personNum : null,
+                    responsiblePerson : "",
+                    type : null,
+                    attendanceTime : null,
+                    remark : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/group/list.vue b/attendance-performance-manager-ui/admin/src/views/attendance/group/list.vue
new file mode 100644
index 0000000000000000000000000000000000000000..6e6d7f687827bdd1cd3e61c9bd7db7cf5d1e0471
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/group/list.vue
@@ -0,0 +1,66 @@
+<template>
+    <div class="page">
+        <LayoutTable :data="tableData" :config="tableConfig">
+                    </LayoutTable>
+
+
+        <drawer-show ref="drawerform" @ok="getData" />
+    </div>
+</template>
+
+<script>
+    /** 琛ㄥ崟寮瑰嚭妗嗘ā寮忛渶寮曞叆 */
+    import drawerShow from "./drawershow";
+    import table from "@/assets/mixins/table";
+    export default {
+        name: "AttendanceGroupList",
+        components: {
+            drawerShow
+},
+        mixins: [table],
+        created() {
+        },
+        methods: {
+            /** 閲嶅啓鏂板鏂规硶 */
+            toAdd(row) {
+                this.$refs.drawerform.add(row);
+            },
+            /** 閲嶅啓缂栬緫鏂规硶 */
+            toEdit(row) {
+                this.$refs.drawerform.edit(row);
+            },
+            /** 閲嶅啓鏌ョ湅鏂规硶 */
+            toView(row) {
+                this.$refs.drawerform.view(row);
+            },
+
+        },
+        data() {
+            return {
+                config: {
+                    search: [
+                    ],
+                    columns: [
+                        {type: "selection", width: 60},
+                        {type: "index",label: "搴忓彿",width: 50},
+
+                        {label: "浜烘暟", prop: "personNum",formatter: this.formatter},
+
+                        {label: "绫诲瀷", prop: "type",formatter: this.formatter},
+
+                        {label: "鍒涘缓鐢ㄦ埛", prop: "createUserId", formatter: this.formatter},
+                        {
+                            label: "鎿嶄綔",
+                            width: 240,
+                            formatter: row => {
+                                return (
+                                    <table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
+                            );
+                            }
+                        }
+                    ]
+                }
+            };
+        }
+    };
+</script>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/group/view.vue b/attendance-performance-manager-ui/admin/src/views/attendance/group/view.vue
new file mode 100644
index 0000000000000000000000000000000000000000..b4f7343d06ac41b7fa9f19cc4b97d0ac6b3e7259
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/group/view.vue
@@ -0,0 +1,74 @@
+<template>
+    <layout-view>
+        <el-descriptions  :title="title" :column="column" :size="size" :colon="false" border>
+            <template slot="title">
+                <i class="el-icon-tickets"></i>
+                鍩烘湰璇︾粏淇℃伅
+            </template>
+            <template slot="extra">
+                <el-button type="primary" @click="$router.go(-1)" size="small">杩斿洖</el-button>
+            </template>
+                                    <el-descriptions-item label="鑰冨嫟缁勫悕绉�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.groupName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="浜烘暟" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.personNum}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="璐熻矗浜�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.responsiblePerson}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="绫诲瀷" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("type", form.type) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑰冨嫟鏃堕棿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.attendanceTime}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="澶囨敞" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.remark}}
+                        </el-descriptions-item>
+        </el-descriptions>
+
+    </layout-view>
+</template>
+
+<script>
+    import view from "@/assets/mixins/view";
+    export default {
+        mixins: [view],
+        components: {
+        },
+        methods: {
+
+        },
+        data() {
+            return {
+                size:"small",
+                column:2,
+                toString:[
+                    "type",
+                    "attendanceTime",
+                ],
+                toArrays: [
+
+                ],
+                toDate: [
+
+                ]
+            }
+        }
+    }
+</script>
+<style lang="less">
+    .labelClass{
+        width: 200px;
+    }
+    .el-descriptions__body{
+        margin-left: 5px;
+        margin-right: 5px;
+        color: #606266;
+        background-color: #FFF;
+    }
+    .contentClass{
+        width: 600px;
+    }
+</style>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/leave/record/dialogshow.vue b/attendance-performance-manager-ui/admin/src/views/attendance/leave/record/dialogshow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..718e091d5250781dd739da728636909a5e030139
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/leave/record/dialogshow.vue
@@ -0,0 +1,126 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-dialog :title="title" :visible.sync="open" width="90%" append-to-body>
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="璇峰亣浜篿d" prop="leavePersonId" v-model="form.leavePersonId" placeholder="璇疯緭鍏ヨ鍋囦汉id"/>
+                            <Field label="璇峰亣浜�" prop="leavePerson" v-model="form.leavePerson" placeholder="璇疯緭鍏ヨ鍋囦汉"/>
+                            <Field label="鎵€灞為儴闂╥d" prop="deptId" v-model="form.deptId" placeholder="璇疯緭鍏ユ墍灞為儴闂╥d"/>
+                            <Field label="鎵€灞為儴闂�" prop="deptName" v-model="form.deptName" type="textarea" placeholder="璇疯緭鍏ユ墍灞為儴闂�"/>
+                            <Field label="鐢佃瘽鍙风爜" prop="phoneNumber" v-model="form.phoneNumber" placeholder="璇疯緭鍏ョ數璇濆彿鐮�"/>
+                            <Field label="璇峰亣绫诲瀷" prop="leaveType" v-model="form.leaveType" type="select" :enumData="dict.leaveType" placeholder="璇烽€夋嫨璇峰亣绫诲瀷"/>
+                            <Field label="寮€濮嬫椂闂�" prop="startTime" v-model="form.startTime" type="date" />
+                            <Field label="缁撴潫鏃堕棿" prop="endTime" v-model="form.endTime" type="date" />
+                            <Field label="鏃堕暱,鍗曚綅绉�" prop="duration" v-model="form.duration" placeholder="璇疯緭鍏ユ椂闀�,鍗曚綅绉�"/>
+                            <Field label="璇峰亣浜嬬敱" prop="reason" v-model="form.reason" type="textarea" placeholder="璇疯緭鍏ヨ鍋囦簨鐢�"/>
+                            <Field label="瀹℃壒璐熻矗浜篒d" prop="approverId" v-model="form.approverId" placeholder="璇疯緭鍏ュ鎵硅礋璐d汉Id"/>
+                            <Field label="瀹℃壒璐熻矗浜�" prop="approver" v-model="form.approver" placeholder="璇疯緭鍏ュ鎵硅礋璐d汉"/>
+                            <Field label="闄勪欢" prop="attachment" v-model="form.attachment" type="textarea" placeholder="璇疯緭鍏ラ檮浠�"/>
+                            <Field label="闄勪欢璺緞" prop="attachmentPath" v-model="form.attachmentPath" type="textarea" placeholder="璇疯緭鍏ラ檮浠惰矾寰�"/>
+                            <Field label="澶囨敞" prop="remark" v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+
+            </el-row>
+
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button type="primary" v-if="pageInfo.type !== 'view'" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    import dialogShow from "./dialogshow";
+    export default {
+        mixins: [form],
+        components: {
+            dialogShow ,
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "璇峰亣璁板綍淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                toString:[
+                    "leaveType",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/leave/record/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼璇峰亣璁板綍淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "attendance/leave/record/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板璇峰亣璁板綍淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/leave/record/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "璇峰亣璁板綍淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    leavePersonId : null,
+                    leavePerson : "",
+                    deptId : null,
+                    deptName : "",
+                    phoneNumber : "",
+                    leaveType : null,
+                    startTime : null,
+                    endTime : null,
+                    duration : null,
+                    reason : "",
+                    approverId : null,
+                    approver : "",
+                    attachment : "",
+                    attachmentPath : "",
+                    remark : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/leave/record/drawershow.vue b/attendance-performance-manager-ui/admin/src/views/attendance/leave/record/drawershow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..5a831b7c8cebcfd0a0431ae28c2e08dca2ade681
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/leave/record/drawershow.vue
@@ -0,0 +1,136 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-drawer
+            :title="title"
+            :visible.sync="open"
+            :direction="direction"
+            size="50%">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="璇峰亣浜篿d" prop="leavePersonId" v-model="form.leavePersonId" placeholder="璇疯緭鍏ヨ鍋囦汉id"/>
+                            <Field label="璇峰亣浜�" prop="leavePerson" v-model="form.leavePerson" placeholder="璇疯緭鍏ヨ鍋囦汉"/>
+                            <Field label="鎵€灞為儴闂╥d" prop="deptId" v-model="form.deptId" placeholder="璇疯緭鍏ユ墍灞為儴闂╥d"/>
+                            <Field label="鎵€灞為儴闂�" prop="deptName" v-model="form.deptName" type="textarea" placeholder="璇疯緭鍏ユ墍灞為儴闂�"/>
+                            <Field label="鐢佃瘽鍙风爜" prop="phoneNumber" v-model="form.phoneNumber" placeholder="璇疯緭鍏ョ數璇濆彿鐮�"/>
+                            <Field label="璇峰亣绫诲瀷" prop="leaveType" v-model="form.leaveType" type="select" :enumData="dict.leaveType" placeholder="璇烽€夋嫨璇峰亣绫诲瀷"/>
+                            <Field label="寮€濮嬫椂闂�" prop="startTime" v-model="form.startTime" type="date" />
+                            <Field label="缁撴潫鏃堕棿" prop="endTime" v-model="form.endTime" type="date" />
+                            <Field label="鏃堕暱,鍗曚綅绉�" prop="duration" v-model="form.duration" placeholder="璇疯緭鍏ユ椂闀�,鍗曚綅绉�"/>
+                            <Field label="璇峰亣浜嬬敱" prop="reason" v-model="form.reason" type="textarea" placeholder="璇疯緭鍏ヨ鍋囦簨鐢�"/>
+                            <Field label="瀹℃壒璐熻矗浜篒d" prop="approverId" v-model="form.approverId" placeholder="璇疯緭鍏ュ鎵硅礋璐d汉Id"/>
+                            <Field label="瀹℃壒璐熻矗浜�" prop="approver" v-model="form.approver" placeholder="璇疯緭鍏ュ鎵硅礋璐d汉"/>
+                            <Field label="闄勪欢" prop="attachment" v-model="form.attachment" type="textarea" placeholder="璇疯緭鍏ラ檮浠�"/>
+                            <Field label="闄勪欢璺緞" prop="attachmentPath" v-model="form.attachmentPath" type="textarea" placeholder="璇疯緭鍏ラ檮浠惰矾寰�"/>
+                            <Field label="澶囨敞" prop="remark" v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+
+            </el-row>
+
+            <form-buttons @submit='submitForm' noCancelBtn />
+        </el-form>
+
+    </el-drawer>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    export default {
+        name: "AttendanceLeaveRecordDetail",
+        mixins: [form],
+        components: {
+
+        },
+        created() {
+            this.changePath("attendance/leave/record")
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "璇峰亣璁板綍淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                direction:"rtl",
+                toString:[
+                    "leaveType",
+                ],
+                toDate:[
+                    "startTime",
+                    "endTime",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/leave/record/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼璇峰亣璁板綍淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "attendance/leave/record/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板璇峰亣璁板綍淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/leave/record/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "璇峰亣璁板綍淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    leavePersonId : null,
+                    leavePerson : "",
+                    deptId : null,
+                    deptName : "",
+                    phoneNumber : "",
+                    leaveType : null,
+                    startTime : null,
+                    endTime : null,
+                    duration : null,
+                    reason : "",
+                    approverId : null,
+                    approver : "",
+                    attachment : "",
+                    attachmentPath : "",
+                    remark : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/leave/record/list.vue b/attendance-performance-manager-ui/admin/src/views/attendance/leave/record/list.vue
new file mode 100644
index 0000000000000000000000000000000000000000..dfaa0b0ff9a252d2866de8f623c878669feb5e65
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/leave/record/list.vue
@@ -0,0 +1,114 @@
+<template>
+    <div class="page">
+        <LayoutTable :data="tableData" :config="tableConfig">
+                    </LayoutTable>
+
+
+        <drawer-show ref="drawerform" @ok="getData" />
+    </div>
+</template>
+
+<script>
+    /** 琛ㄥ崟寮瑰嚭妗嗘ā寮忛渶寮曞叆 */
+    import drawerShow from "./drawershow";
+    import table from "@/assets/mixins/table";
+    export default {
+        name: "AttendanceLeaveRecordList",
+        components: {
+            drawerShow
+},
+        mixins: [table],
+        created() {
+        },
+        methods: {
+            /** 閲嶅啓鏂板鏂规硶 */
+            toAdd(row) {
+                this.$refs.drawerform.add(row);
+            },
+            /** 閲嶅啓缂栬緫鏂规硶 */
+            toEdit(row) {
+                this.$refs.drawerform.edit(row);
+            },
+            /** 閲嶅啓鏌ョ湅鏂规硶 */
+            toView(row) {
+                this.$refs.drawerform.view(row);
+            },
+
+        },
+        data() {
+            return {
+                config: {
+                    search: [
+                        {
+                            name: "leavePersonId",
+                            type: "text",
+                            label: "璇峰亣浜篿d",
+                            fuzzy: true
+                        },
+                        {
+                            name: "phoneNumber",
+                            type: "text",
+                            label: "鐢佃瘽鍙风爜",
+                            fuzzy: true
+                        },
+                        {
+                            name: "leaveType",
+                            type: "select",
+                            label: "璇峰亣绫诲瀷",
+                            fuzzy: true
+                        },
+                        {
+                            name: "startTime",
+                            type: "date",
+                            label: "寮€濮嬫椂闂�",
+                            fuzzy: true
+                        },
+                        {
+                            name: "endTime",
+                            type: "date",
+                            label: "缁撴潫鏃堕棿",
+                            fuzzy: true
+                        },
+                    ],
+                    columns: [
+                        {type: "selection", width: 60},
+                        {type: "index",label: "搴忓彿",width: 50},
+
+                        {label: "璇峰亣浜篿d", prop: "leavePersonId", formatter: this.formatter},
+
+                        {label: "璇峰亣浜�", prop: "leavePerson"},
+
+                        {label: "鎵€灞為儴闂╥d", prop: "deptId", formatter: this.formatter},
+
+                        {label: "鎵€灞為儴闂�", prop: "deptName"},
+
+                        {label: "鐢佃瘽鍙风爜", prop: "phoneNumber"},
+
+                        {label: "璇峰亣绫诲瀷", prop: "leaveType",formatter: this.formatter},
+
+                        {label: "寮€濮嬫椂闂�", prop: "startTime", formatter: this.formatterDate},
+
+                        {label: "缁撴潫鏃堕棿", prop: "endTime", formatter: this.formatterDate},
+
+                        {label: "鏃堕暱,鍗曚綅绉�", prop: "duration",formatter: this.formatter},
+
+                        {label: "瀹℃壒璐熻矗浜篒d", prop: "approverId", formatter: this.formatter},
+
+                        {label: "瀹℃壒璐熻矗浜�", prop: "approver"},
+
+                        {label: "鍒涘缓鐢ㄦ埛", prop: "createUserId", formatter: this.formatter},
+                        {
+                            label: "鎿嶄綔",
+                            width: 240,
+                            formatter: row => {
+                                return (
+                                    <table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
+                            );
+                            }
+                        }
+                    ]
+                }
+            };
+        }
+    };
+</script>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/leave/record/view.vue b/attendance-performance-manager-ui/admin/src/views/attendance/leave/record/view.vue
new file mode 100644
index 0000000000000000000000000000000000000000..d0aee6384cd4498052c76c527348f2690c010c76
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/leave/record/view.vue
@@ -0,0 +1,100 @@
+<template>
+    <layout-view>
+        <el-descriptions  :title="title" :column="column" :size="size" :colon="false" border>
+            <template slot="title">
+                <i class="el-icon-tickets"></i>
+                鍩烘湰璇︾粏淇℃伅
+            </template>
+            <template slot="extra">
+                <el-button type="primary" @click="$router.go(-1)" size="small">杩斿洖</el-button>
+            </template>
+                                    <el-descriptions-item label="璇峰亣浜篿d" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.leavePersonId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="璇峰亣浜�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.leavePerson}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎵€灞為儴闂╥d" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.deptId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎵€灞為儴闂�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.deptName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鐢佃瘽鍙风爜" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.phoneNumber}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="璇峰亣绫诲瀷" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("leaveType", form.leaveType) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="寮€濮嬫椂闂�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.startTime)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="缁撴潫鏃堕棿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.endTime)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鏃堕暱,鍗曚綅绉�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.duration}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="璇峰亣浜嬬敱" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.reason}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="瀹℃壒璐熻矗浜篒d" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.approverId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="瀹℃壒璐熻矗浜�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.approver}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="闄勪欢" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.attachment}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="闄勪欢璺緞" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.attachmentPath}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="澶囨敞" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.remark}}
+                        </el-descriptions-item>
+        </el-descriptions>
+
+    </layout-view>
+</template>
+
+<script>
+    import view from "@/assets/mixins/view";
+    export default {
+        mixins: [view],
+        components: {
+        },
+        methods: {
+
+        },
+        data() {
+            return {
+                size:"small",
+                column:2,
+                toString:[
+                    "leaveType",
+                ],
+                toArrays: [
+
+                ],
+                toDate: [
+
+                ]
+            }
+        }
+    }
+</script>
+<style lang="less">
+    .labelClass{
+        width: 200px;
+    }
+    .el-descriptions__body{
+        margin-left: 5px;
+        margin-right: 5px;
+        color: #606266;
+        background-color: #FFF;
+    }
+    .contentClass{
+        width: 600px;
+    }
+</style>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/record/detail/dialogshow.vue b/attendance-performance-manager-ui/admin/src/views/attendance/record/detail/dialogshow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..cd477e1866a293702cd1782d6dd519b38ea46932
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/record/detail/dialogshow.vue
@@ -0,0 +1,116 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-dialog :title="title" :visible.sync="open" width="90%" append-to-body>
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鑰冨嫟璁板綍ID" prop="recordId" v-model="form.recordId" placeholder="璇疯緭鍏ヨ€冨嫟璁板綍ID"/>
+                            <Field label="鐝ID" prop="shiftsId" v-model="form.shiftsId" placeholder="璇疯緭鍏ョ彮娆D"/>
+                            <Field label="鐝鍚嶇О" prop="shiftsName" v-model="form.shiftsName" placeholder="璇疯緭鍏ョ彮娆″悕绉�"/>
+                            <Field label="涓婄彮鎵撳崱鏃堕棿" prop="goWorkDate" v-model="form.goWorkDate" type="date" />
+                            <Field label="涓婄彮鎵撳崱缁撴灉" prop="goWorkResult" v-model="form.goWorkResult" type="select" :enumData="dict.goWorkResult" placeholder="璇烽€夋嫨涓婄彮鎵撳崱缁撴灉"/>
+                            <Field label="涓嬬彮鎵撳崱鏃堕棿" prop="offWorkDate" v-model="form.offWorkDate" type="date" />
+                            <Field label="涓嬬彮鎵撳崱缁撴灉" prop="offWorkResult" v-model="form.offWorkResult" type="select" :enumData="dict.offWorkResult" placeholder="璇烽€夋嫨涓嬬彮鎵撳崱缁撴灉"/>
+                            <Field label="澶囨敞" prop="remark" v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+
+            </el-row>
+
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button type="primary" v-if="pageInfo.type !== 'view'" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    import dialogShow from "./dialogshow";
+    export default {
+        mixins: [form],
+        components: {
+            dialogShow ,
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                toString:[
+                    "goWorkResult",
+                    "offWorkResult",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/record/detail/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "attendance/record/detail/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/record/detail/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    recordId : null,
+                    shiftsId : null,
+                    shiftsName : "",
+                    goWorkDate : null,
+                    goWorkResult : null,
+                    offWorkDate : null,
+                    offWorkResult : null,
+                    remark : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/record/detail/drawershow.vue b/attendance-performance-manager-ui/admin/src/views/attendance/record/detail/drawershow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c9d7124d1d3bf0ba1949499892df96e4716f53be
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/record/detail/drawershow.vue
@@ -0,0 +1,126 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-drawer
+            :title="title"
+            :visible.sync="open"
+            :direction="direction"
+            size="50%">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鑰冨嫟璁板綍ID" prop="recordId" v-model="form.recordId" placeholder="璇疯緭鍏ヨ€冨嫟璁板綍ID"/>
+                            <Field label="鐝ID" prop="shiftsId" v-model="form.shiftsId" placeholder="璇疯緭鍏ョ彮娆D"/>
+                            <Field label="鐝鍚嶇О" prop="shiftsName" v-model="form.shiftsName" placeholder="璇疯緭鍏ョ彮娆″悕绉�"/>
+                            <Field label="涓婄彮鎵撳崱鏃堕棿" prop="goWorkDate" v-model="form.goWorkDate" type="date" />
+                            <Field label="涓婄彮鎵撳崱缁撴灉" prop="goWorkResult" v-model="form.goWorkResult" type="select" :enumData="dict.goWorkResult" placeholder="璇烽€夋嫨涓婄彮鎵撳崱缁撴灉"/>
+                            <Field label="涓嬬彮鎵撳崱鏃堕棿" prop="offWorkDate" v-model="form.offWorkDate" type="date" />
+                            <Field label="涓嬬彮鎵撳崱缁撴灉" prop="offWorkResult" v-model="form.offWorkResult" type="select" :enumData="dict.offWorkResult" placeholder="璇烽€夋嫨涓嬬彮鎵撳崱缁撴灉"/>
+                            <Field label="澶囨敞" prop="remark" v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+
+            </el-row>
+
+            <form-buttons @submit='submitForm' noCancelBtn />
+        </el-form>
+
+    </el-drawer>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    export default {
+        name: "AttendanceRecordDetailDetail",
+        mixins: [form],
+        components: {
+
+        },
+        created() {
+            this.changePath("attendance/record/detail")
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                direction:"rtl",
+                toString:[
+                    "goWorkResult",
+                    "offWorkResult",
+                ],
+                toDate:[
+                    "goWorkDate",
+                    "offWorkDate",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/record/detail/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "attendance/record/detail/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/record/detail/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    recordId : null,
+                    shiftsId : null,
+                    shiftsName : "",
+                    goWorkDate : null,
+                    goWorkResult : null,
+                    offWorkDate : null,
+                    offWorkResult : null,
+                    remark : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/record/detail/list.vue b/attendance-performance-manager-ui/admin/src/views/attendance/record/detail/list.vue
new file mode 100644
index 0000000000000000000000000000000000000000..32515b4d2b201d4026c70abce69e20bfc887dc77
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/record/detail/list.vue
@@ -0,0 +1,66 @@
+<template>
+    <div class="page">
+        <LayoutTable :data="tableData" :config="tableConfig">
+                    </LayoutTable>
+
+
+        <drawer-show ref="drawerform" @ok="getData" />
+    </div>
+</template>
+
+<script>
+    /** 琛ㄥ崟寮瑰嚭妗嗘ā寮忛渶寮曞叆 */
+    import drawerShow from "./drawershow";
+    import table from "@/assets/mixins/table";
+    export default {
+        name: "AttendanceRecordDetailList",
+        components: {
+            drawerShow
+},
+        mixins: [table],
+        created() {
+        },
+        methods: {
+            /** 閲嶅啓鏂板鏂规硶 */
+            toAdd(row) {
+                this.$refs.drawerform.add(row);
+            },
+            /** 閲嶅啓缂栬緫鏂规硶 */
+            toEdit(row) {
+                this.$refs.drawerform.edit(row);
+            },
+            /** 閲嶅啓鏌ョ湅鏂规硶 */
+            toView(row) {
+                this.$refs.drawerform.view(row);
+            },
+
+        },
+        data() {
+            return {
+                config: {
+                    search: [
+                    ],
+                    columns: [
+                        {type: "selection", width: 60},
+                        {type: "index",label: "搴忓彿",width: 50},
+
+                        {label: "涓婄彮鎵撳崱鏃堕棿", prop: "goWorkDate", formatter: this.formatterDate},
+
+                        {label: "涓嬬彮鎵撳崱鏃堕棿", prop: "offWorkDate", formatter: this.formatterDate},
+
+                        {label: "鍒涘缓鐢ㄦ埛", prop: "createUserId", formatter: this.formatter},
+                        {
+                            label: "鎿嶄綔",
+                            width: 240,
+                            formatter: row => {
+                                return (
+                                    <table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
+                            );
+                            }
+                        }
+                    ]
+                }
+            };
+        }
+    };
+</script>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/record/detail/view.vue b/attendance-performance-manager-ui/admin/src/views/attendance/record/detail/view.vue
new file mode 100644
index 0000000000000000000000000000000000000000..8aefdc7da3544c374786542ee4bf0283182d2cb2
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/record/detail/view.vue
@@ -0,0 +1,80 @@
+<template>
+    <layout-view>
+        <el-descriptions  :title="title" :column="column" :size="size" :colon="false" border>
+            <template slot="title">
+                <i class="el-icon-tickets"></i>
+                鍩烘湰璇︾粏淇℃伅
+            </template>
+            <template slot="extra">
+                <el-button type="primary" @click="$router.go(-1)" size="small">杩斿洖</el-button>
+            </template>
+                                    <el-descriptions-item label="鑰冨嫟璁板綍ID" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.recordId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鐝ID" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.shiftsId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鐝鍚嶇О" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.shiftsName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="涓婄彮鎵撳崱鏃堕棿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.goWorkDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="涓婄彮鎵撳崱缁撴灉" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("goWorkResult", form.goWorkResult) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="涓嬬彮鎵撳崱鏃堕棿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.offWorkDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="涓嬬彮鎵撳崱缁撴灉" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("offWorkResult", form.offWorkResult) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="澶囨敞" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.remark}}
+                        </el-descriptions-item>
+        </el-descriptions>
+
+    </layout-view>
+</template>
+
+<script>
+    import view from "@/assets/mixins/view";
+    export default {
+        mixins: [view],
+        components: {
+        },
+        methods: {
+
+        },
+        data() {
+            return {
+                size:"small",
+                column:2,
+                toString:[
+                    "goWorkResult",
+                    "offWorkResult",
+                ],
+                toArrays: [
+
+                ],
+                toDate: [
+
+                ]
+            }
+        }
+    }
+</script>
+<style lang="less">
+    .labelClass{
+        width: 200px;
+    }
+    .el-descriptions__body{
+        margin-left: 5px;
+        margin-right: 5px;
+        color: #606266;
+        background-color: #FFF;
+    }
+    .contentClass{
+        width: 600px;
+    }
+</style>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/record/dialogshow.vue b/attendance-performance-manager-ui/admin/src/views/attendance/record/dialogshow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e020af295bd612513832a56f13d6430feba91b00
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/record/dialogshow.vue
@@ -0,0 +1,246 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-dialog :title="title" :visible.sync="open" width="90%" append-to-body>
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍛樺伐ID" prop="staffId" v-model="form.staffId" placeholder="璇疯緭鍏ュ憳宸D"/>
+                            <Field label="鍛樺伐濮撳悕" prop="staffName" v-model="form.staffName" placeholder="璇疯緭鍏ュ憳宸ュ鍚�"/>
+                            <Field label="宸ュ彿" prop="workNum" v-model="form.workNum" placeholder="璇疯緭鍏ュ伐鍙�"/>
+                            <Field label="鎵€灞為儴闂�" prop="deptId" v-model="form.deptId" placeholder="璇疯緭鍏ユ墍灞為儴闂�"/>
+                            <Field label="鎵€灞為儴闂ㄥ悕绉�" prop="deptName" v-model="form.deptName" placeholder="璇疯緭鍏ユ墍灞為儴闂ㄥ悕绉�"/>
+                            <Field label="鑱屼綅ID" prop="positionId" v-model="form.positionId" placeholder="璇疯緭鍏ヨ亴浣岻D"/>
+                            <Field label="鑱屼綅鍚嶇О" prop="positionName" v-model="form.positionName" placeholder="璇疯緭鍏ヨ亴浣嶅悕绉�"/>
+                            <Field label="鎵€灞炶€冨嫟缁処D" prop="attendanceGroupId" v-model="form.attendanceGroupId" placeholder="璇疯緭鍏ユ墍灞炶€冨嫟缁処D"/>
+                            <Field label="鎵€灞炶€冨嫟缁勫悕绉�" prop="attendanceGroupName" v-model="form.attendanceGroupName" placeholder="璇疯緭鍏ユ墍灞炶€冨嫟缁勫悕绉�"/>
+                            <Field label="鐝ID" prop="shiftsId" v-model="form.shiftsId" placeholder="璇疯緭鍏ョ彮娆D"/>
+                            <Field label="鐝鍚嶇О" prop="shiftsName" v-model="form.shiftsName" placeholder="璇疯緭鍏ョ彮娆″悕绉�"/>
+                            <Field label="鎵撳崱鏃ユ湡" prop="attendanceDate" v-model="form.attendanceDate" type="date" />
+                            <Field label="澶囨敞" prop="remark" v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+
+            </el-row>
+                <el-divider content-position="center">鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅淇℃伅</el-divider>
+                <br/>
+                <el-row :gutter="10" class="mb8">
+                    <el-col :span="1.5">
+                        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAddAttendanceRecordDetail">娣诲姞</el-button>
+                    </el-col>
+                    <el-col :span="1.5">
+                        <el-button type="danger" icon="el-icon-delete" size="mini" @click="handleDeleteAttendanceRecordDetail">鍒犻櫎</el-button>
+                    </el-col>
+                </el-row>
+
+                <el-table :data="attendanceRecordDetailList" :row-class-name="rowAttendanceRecordDetailIndex" @selection-change="handleAttendanceRecordDetailSelectionChange" ref="attendanceRecordDetail">
+                    <el-table-column type="selection" width="50" align="center" />
+                    <el-table-column label="搴忓彿" align="center" prop="index" width="50"/>
+                            <el-table-column label="鐝ID" prop="shiftsId">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.shiftsId" placeholder="璇疯緭鍏ョ彮娆D" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="鐝鍚嶇О" prop="shiftsName">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.shiftsName" placeholder="璇疯緭鍏ョ彮娆″悕绉�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓婄彮鎵撳崱鏃堕棿" prop="goWorkDate">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.goWorkDate" placeholder="璇疯緭鍏ヤ笂鐝墦鍗℃椂闂�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓婄彮鎵撳崱缁撴灉" prop="goWorkResult">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.goWorkResult" placeholder="璇疯緭鍏ヤ笂鐝墦鍗$粨鏋�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓嬬彮鎵撳崱鏃堕棿" prop="offWorkDate">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.offWorkDate" placeholder="璇疯緭鍏ヤ笅鐝墦鍗℃椂闂�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓嬬彮鎵撳崱缁撴灉" prop="offWorkResult">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.offWorkResult" placeholder="璇疯緭鍏ヤ笅鐝墦鍗$粨鏋�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="澶囨敞" prop="remark">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.remark" placeholder="璇疯緭鍏ュ娉�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="鍒涘缓鐢ㄦ埛" prop="createUserId">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.createUserId" placeholder="璇疯緭鍏ュ垱寤虹敤鎴�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="鍒涘缓鏃堕棿" prop="createTime">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.createTime" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="鏇存柊鐢ㄦ埛" prop="updateUserId">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.updateUserId" placeholder="璇疯緭鍏ユ洿鏂扮敤鎴�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="鏇存柊鏃堕棿" prop="updateTime">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.updateTime" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" />
+                                </template>
+                            </el-table-column>
+                </el-table>
+
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button type="primary" v-if="pageInfo.type !== 'view'" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    import dialogShow from "./dialogshow";
+    export default {
+        mixins: [form],
+        components: {
+            dialogShow ,
+        },
+        data() {
+            return {
+                // 瀛愯〃閫変腑鏁版嵁
+                checkedAttendanceRecordDetail: [],
+                // 鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅琛ㄦ牸鏁版嵁
+                attendanceRecordDetailList: [],
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鑰冨嫟鎵撳崱璁板綍淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                toString:[
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    staffName: [
+                        {required: true,message: "璇疯緭鍏ュ憳宸ュ鍚�", trigger: "blur" },
+                        {max: 64,message: "鏈€澶氬彧鑳藉綍鍏�64涓瓧绗�",trigger: "blur",},
+                    ],
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅搴忓彿 */
+            rowAttendanceRecordDetailIndex({ row, rowIndex }) {
+                row.index = rowIndex + 1;
+            },
+            /** 鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅娣诲姞鎸夐挳鎿嶄綔 */
+            handleAddAttendanceRecordDetail() {
+                let obj = {};
+                obj.shiftsId = "";
+                obj.shiftsName = "";
+                obj.goWorkDate = "";
+                obj.goWorkResult = "";
+                obj.offWorkDate = "";
+                obj.offWorkResult = "";
+                obj.remark = "";
+                obj.createUserId = "";
+                obj.createTime = "";
+                obj.updateUserId = "";
+                obj.updateTime = "";
+                this.attendanceRecordDetailList.push(obj);
+            },
+            /** 鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅鍒犻櫎鎸夐挳鎿嶄綔 */
+            handleDeleteAttendanceRecordDetail() {
+                if (this.checkedAttendanceRecordDetail.length == 0) {
+                    this.$alert("璇峰厛閫夋嫨瑕佸垹闄ょ殑鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅鏁版嵁", "鎻愮ず", { confirmButtonText: "纭畾", });
+                } else {
+                    this.attendanceRecordDetailList.splice(this.checkedAttendanceRecordDetail[0].index - 1, 1);
+                }
+            },
+            /** 鍗曢€夋閫変腑鏁版嵁 */
+            handleAttendanceRecordDetailSelectionChange(selection) {
+                if (selection.length > 1) {
+                    this.$refs.attendanceRecordDetail.clearSelection();
+                    this.$refs.attendanceRecordDetail.toggleRowSelection(selection.pop());
+                } else {
+                    this.checkedAttendanceRecordDetail = selection;
+                }
+            },
+            // 娓叉煋鍓嶇疆澶勭悊
+            beforeRender(data) {
+                if(data.entity.attendanceRecordDetailList) {
+                    this.attendanceRecordDetailList = data.entity.attendanceRecordDetailList;
+                }
+                return data
+            },
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/record/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鑰冨嫟鎵撳崱璁板綍淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "attendance/record/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鑰冨嫟鎵撳崱璁板綍淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/record/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鑰冨嫟鎵撳崱璁板綍淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    staffId : null,
+                    staffName : "",
+                    workNum : "",
+                    deptId : null,
+                    deptName : "",
+                    positionId : null,
+                    positionName : "",
+                    attendanceGroupId : null,
+                    attendanceGroupName : "",
+                    shiftsId : null,
+                    shiftsName : "",
+                    attendanceDate : null,
+                    remark : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/record/drawershow.vue b/attendance-performance-manager-ui/admin/src/views/attendance/record/drawershow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..35debe1684acf1d743f02a0714fe07500b2cee3b
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/record/drawershow.vue
@@ -0,0 +1,255 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-drawer
+            :title="title"
+            :visible.sync="open"
+            :direction="direction"
+            size="50%">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍛樺伐ID" prop="staffId" v-model="form.staffId" placeholder="璇疯緭鍏ュ憳宸D"/>
+                            <Field label="鍛樺伐濮撳悕" prop="staffName" v-model="form.staffName" placeholder="璇疯緭鍏ュ憳宸ュ鍚�"/>
+                            <Field label="宸ュ彿" prop="workNum" v-model="form.workNum" placeholder="璇疯緭鍏ュ伐鍙�"/>
+                            <Field label="鎵€灞為儴闂�" prop="deptId" v-model="form.deptId" placeholder="璇疯緭鍏ユ墍灞為儴闂�"/>
+                            <Field label="鎵€灞為儴闂ㄥ悕绉�" prop="deptName" v-model="form.deptName" placeholder="璇疯緭鍏ユ墍灞為儴闂ㄥ悕绉�"/>
+                            <Field label="鑱屼綅ID" prop="positionId" v-model="form.positionId" placeholder="璇疯緭鍏ヨ亴浣岻D"/>
+                            <Field label="鑱屼綅鍚嶇О" prop="positionName" v-model="form.positionName" placeholder="璇疯緭鍏ヨ亴浣嶅悕绉�"/>
+                            <Field label="鎵€灞炶€冨嫟缁処D" prop="attendanceGroupId" v-model="form.attendanceGroupId" placeholder="璇疯緭鍏ユ墍灞炶€冨嫟缁処D"/>
+                            <Field label="鎵€灞炶€冨嫟缁勫悕绉�" prop="attendanceGroupName" v-model="form.attendanceGroupName" placeholder="璇疯緭鍏ユ墍灞炶€冨嫟缁勫悕绉�"/>
+                            <Field label="鐝ID" prop="shiftsId" v-model="form.shiftsId" placeholder="璇疯緭鍏ョ彮娆D"/>
+                            <Field label="鐝鍚嶇О" prop="shiftsName" v-model="form.shiftsName" placeholder="璇疯緭鍏ョ彮娆″悕绉�"/>
+                            <Field label="鎵撳崱鏃ユ湡" prop="attendanceDate" v-model="form.attendanceDate" type="date" />
+                            <Field label="澶囨敞" prop="remark" v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+
+            </el-row>
+                <el-divider content-position="center">鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅淇℃伅</el-divider>
+                <br/>
+                <el-row :gutter="10" class="mb8">
+                    <el-col :span="1.5">
+                        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAddAttendanceRecordDetail">娣诲姞</el-button>
+                    </el-col>
+                    <el-col :span="1.5">
+                        <el-button type="danger" icon="el-icon-delete" size="mini" @click="handleDeleteAttendanceRecordDetail">鍒犻櫎</el-button>
+                    </el-col>
+                </el-row>
+
+                <el-table :data="attendanceRecordDetailList" :row-class-name="rowAttendanceRecordDetailIndex" @selection-change="handleAttendanceRecordDetailSelectionChange" ref="attendanceRecordDetail">
+                    <el-table-column type="selection" width="50" align="center" />
+                    <el-table-column label="搴忓彿" align="center" prop="index" width="50"/>
+                            <el-table-column label="鐝ID" prop="shiftsId">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.shiftsId" placeholder="璇疯緭鍏ョ彮娆D" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="鐝鍚嶇О" prop="shiftsName">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.shiftsName" placeholder="璇疯緭鍏ョ彮娆″悕绉�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓婄彮鎵撳崱鏃堕棿" prop="goWorkDate">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.goWorkDate" placeholder="璇疯緭鍏ヤ笂鐝墦鍗℃椂闂�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓婄彮鎵撳崱缁撴灉" prop="goWorkResult">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.goWorkResult" placeholder="璇疯緭鍏ヤ笂鐝墦鍗$粨鏋�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓嬬彮鎵撳崱鏃堕棿" prop="offWorkDate">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.offWorkDate" placeholder="璇疯緭鍏ヤ笅鐝墦鍗℃椂闂�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="涓嬬彮鎵撳崱缁撴灉" prop="offWorkResult">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.offWorkResult" placeholder="璇疯緭鍏ヤ笅鐝墦鍗$粨鏋�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="澶囨敞" prop="remark">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.remark" placeholder="璇疯緭鍏ュ娉�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="鍒涘缓鐢ㄦ埛" prop="createUserId">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.createUserId" placeholder="璇疯緭鍏ュ垱寤虹敤鎴�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="鍒涘缓鏃堕棿" prop="createTime">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.createTime" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="鏇存柊鐢ㄦ埛" prop="updateUserId">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.updateUserId" placeholder="璇疯緭鍏ユ洿鏂扮敤鎴�" />
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="鏇存柊鏃堕棿" prop="updateTime">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.updateTime" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" />
+                                </template>
+                            </el-table-column>
+                </el-table>
+
+            <form-buttons @submit='submitForm' noCancelBtn />
+        </el-form>
+
+    </el-drawer>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    export default {
+        name: "AttendanceRecordDetail",
+        mixins: [form],
+        components: {
+
+        },
+        created() {
+            this.changePath("attendance/record")
+        },
+        data() {
+            return {
+                // 瀛愯〃閫変腑鏁版嵁
+                checkedAttendanceRecordDetail: [],
+                // 鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅琛ㄦ牸鏁版嵁
+                attendanceRecordDetailList: [],
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鑰冨嫟鎵撳崱璁板綍淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                direction:"rtl",
+                toString:[
+                ],
+                toDate:[
+                    "attendanceDate",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    staffName: [
+                        {required: true,message: "璇疯緭鍏ュ憳宸ュ鍚�", trigger: "blur" },
+                        {max: 64,message: "鏈€澶氬彧鑳藉綍鍏�64涓瓧绗�",trigger: "blur",},
+                    ],
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅搴忓彿 */
+            rowAttendanceRecordDetailIndex({ row, rowIndex }) {
+                row.index = rowIndex + 1;
+            },
+            /** 鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅娣诲姞鎸夐挳鎿嶄綔 */
+            handleAddAttendanceRecordDetail() {
+                let obj = {};
+                obj.shiftsId = "";
+                obj.shiftsName = "";
+                obj.goWorkDate = "";
+                obj.goWorkResult = "";
+                obj.offWorkDate = "";
+                obj.offWorkResult = "";
+                obj.remark = "";
+                obj.createUserId = "";
+                obj.createTime = "";
+                obj.updateUserId = "";
+                obj.updateTime = "";
+                this.attendanceRecordDetailList.push(obj);
+            },
+            /** 鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅鍒犻櫎鎸夐挳鎿嶄綔 */
+            handleDeleteAttendanceRecordDetail() {
+                if (this.checkedAttendanceRecordDetail.length == 0) {
+                    this.$alert("璇峰厛閫夋嫨瑕佸垹闄ょ殑鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅鏁版嵁", "鎻愮ず", { confirmButtonText: "纭畾", });
+                } else {
+                    this.attendanceRecordDetailList.splice(this.checkedAttendanceRecordDetail[0].index - 1, 1);
+                }
+            },
+            /** 鍗曢€夋閫変腑鏁版嵁 */
+            handleAttendanceRecordDetailSelectionChange(selection) {
+                if (selection.length > 1) {
+                    this.$refs.attendanceRecordDetail.clearSelection();
+                    this.$refs.attendanceRecordDetail.toggleRowSelection(selection.pop());
+                } else {
+                    this.checkedAttendanceRecordDetail = selection;
+                }
+            },
+            // 娓叉煋鍓嶇疆澶勭悊
+            beforeRender(data) {
+                if(data.entity.attendanceRecordDetailList) {
+                    this.attendanceRecordDetailList = data.entity.attendanceRecordDetailList;
+                }
+                return data
+            },
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/record/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鑰冨嫟鎵撳崱璁板綍淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "attendance/record/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鑰冨嫟鎵撳崱璁板綍淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/record/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鑰冨嫟鎵撳崱璁板綍淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    staffId : null,
+                    staffName : "",
+                    workNum : "",
+                    deptId : null,
+                    deptName : "",
+                    positionId : null,
+                    positionName : "",
+                    attendanceGroupId : null,
+                    attendanceGroupName : "",
+                    shiftsId : null,
+                    shiftsName : "",
+                    attendanceDate : null,
+                    remark : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/record/list.vue b/attendance-performance-manager-ui/admin/src/views/attendance/record/list.vue
new file mode 100644
index 0000000000000000000000000000000000000000..995961bf7e6a4f9f9d9d3dceee9d880aa17b15e7
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/record/list.vue
@@ -0,0 +1,115 @@
+<template>
+    <div class="page">
+        <LayoutTable :data="tableData" :config="tableConfig">
+                    </LayoutTable>
+
+
+        <drawer-show ref="drawerform" @ok="getData" />
+    </div>
+</template>
+
+<script>
+    /** 琛ㄥ崟寮瑰嚭妗嗘ā寮忛渶寮曞叆 */
+    import drawerShow from "./drawershow";
+    import table from "@/assets/mixins/table";
+    export default {
+        name: "AttendanceRecordList",
+        components: {
+            drawerShow
+},
+        mixins: [table],
+        created() {
+        },
+        methods: {
+            renderTable(tableData) {
+                return (
+                    <el-table stripe data={tableData} class="total-table">
+                    {this.columnSet.map((item) => this.renderTableColumn(item))}
+                    </el-table>
+                );
+            },
+            renderTableColumn(options) {
+                return (
+                    <el-table-column
+                        prop={options.prop}
+                        label={options.label}
+                        width={options.width}
+                    >
+                    </el-table-column>
+                 );
+            },
+            /** 閲嶅啓鏂板鏂规硶 */
+            toAdd(row) {
+                this.$refs.drawerform.add(row);
+            },
+            /** 閲嶅啓缂栬緫鏂规硶 */
+            toEdit(row) {
+                this.$refs.drawerform.edit(row);
+            },
+            /** 閲嶅啓鏌ョ湅鏂规硶 */
+            toView(row) {
+                this.$refs.drawerform.view(row);
+            },
+
+        },
+        data() {
+            return {
+                /** 瀛愯〃鍒楀厓绱� */
+                columnSet:[
+                    {prop:"recordId",label:"鑰冨嫟璁板綍ID",width:100},
+                    {prop:"shiftsId",label:"鐝ID",width:100},
+                    {prop:"shiftsName",label:"鐝鍚嶇О",width:100},
+                    {prop:"goWorkDate",label:"涓婄彮鎵撳崱鏃堕棿",width:100},
+                    {prop:"goWorkResult",label:"涓婄彮鎵撳崱缁撴灉",width:100},
+                    {prop:"offWorkDate",label:"涓嬬彮鎵撳崱鏃堕棿",width:100},
+                    {prop:"offWorkResult",label:"涓嬬彮鎵撳崱缁撴灉",width:100},
+                    {prop:"remark",label:"澶囨敞",width:100},
+                ],
+                config: {
+                    search: [
+                        {
+                            name: "staffName",
+                            type: "text",
+                            label: "鍛樺伐濮撳悕",
+                            fuzzy: true
+                        },
+                    ],
+                    columns: [
+                        {type: "selection", width: 60},
+                        {type: "index",label: "搴忓彿",width: 50},
+
+                        {label: "鍛樺伐濮撳悕", prop: "staffName"},
+
+                        {label: "鎵撳崱鏃ユ湡", prop: "attendanceDate", formatter: this.formatterDate},
+
+                        {label: "鍒涘缓鐢ㄦ埛", prop: "createUserId", formatter: this.formatter},
+                        {label: "鑰冨嫟鎵撳崱璁板綍璇︾粏淇℃伅",
+                          width: 120,
+                          prop: "subColumns",
+                          formatter: (row) => {
+                              let widthsize = this.columnSet.reduce((pre, cur) => {
+                                  return pre + Number(cur.width);
+                              }, 50);
+                              return (
+                                  <el-popover placement="right" width={widthsize} trigger="click">
+                                      {this.renderTable(row.attendanceRecordDetailList)}
+                                      <el-button type="text" slot="reference">璇︾粏</el-button>
+                                  </el-popover>
+                              );
+                          },
+                        },
+                        {
+                            label: "鎿嶄綔",
+                            width: 240,
+                            formatter: row => {
+                                return (
+                                    <table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
+                            );
+                            }
+                        }
+                    ]
+                }
+            };
+        }
+    };
+</script>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/record/view.vue b/attendance-performance-manager-ui/admin/src/views/attendance/record/view.vue
new file mode 100644
index 0000000000000000000000000000000000000000..543180c9e555b480322d0a291220e13f279077d2
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/record/view.vue
@@ -0,0 +1,93 @@
+<template>
+    <layout-view>
+        <el-descriptions  :title="title" :column="column" :size="size" :colon="false" border>
+            <template slot="title">
+                <i class="el-icon-tickets"></i>
+                鍩烘湰璇︾粏淇℃伅
+            </template>
+            <template slot="extra">
+                <el-button type="primary" @click="$router.go(-1)" size="small">杩斿洖</el-button>
+            </template>
+                                    <el-descriptions-item label="鍛樺伐ID" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.staffId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍛樺伐濮撳悕" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.staffName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="宸ュ彿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.workNum}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎵€灞為儴闂�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.deptId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎵€灞為儴闂ㄥ悕绉�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.deptName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱屼綅ID" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.positionId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱屼綅鍚嶇О" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.positionName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎵€灞炶€冨嫟缁処D" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.attendanceGroupId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎵€灞炶€冨嫟缁勫悕绉�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.attendanceGroupName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鐝ID" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.shiftsId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鐝鍚嶇О" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.shiftsName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎵撳崱鏃ユ湡" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.attendanceDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="澶囨敞" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.remark}}
+                        </el-descriptions-item>
+        </el-descriptions>
+
+    </layout-view>
+</template>
+
+<script>
+    import view from "@/assets/mixins/view";
+    export default {
+        mixins: [view],
+        components: {
+        },
+        methods: {
+
+        },
+        data() {
+            return {
+                size:"small",
+                column:2,
+                toString:[
+                ],
+                toArrays: [
+
+                ],
+                toDate: [
+
+                ]
+            }
+        }
+    }
+</script>
+<style lang="less">
+    .labelClass{
+        width: 200px;
+    }
+    .el-descriptions__body{
+        margin-left: 5px;
+        margin-right: 5px;
+        color: #606266;
+        background-color: #FFF;
+    }
+    .contentClass{
+        width: 600px;
+    }
+</style>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/vacation/balance/dialogshow.vue b/attendance-performance-manager-ui/admin/src/views/attendance/vacation/balance/dialogshow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..34a8fa7c619b98d7a5a44e2e7710697b68de5b3e
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/vacation/balance/dialogshow.vue
@@ -0,0 +1,117 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-dialog :title="title" :visible.sync="open" width="90%" append-to-body>
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍛樺伐id" prop="staffId" v-model="form.staffId" placeholder="璇疯緭鍏ュ憳宸d"/>
+                            <Field label="鍛樺伐濮撳悕" prop="staffName" v-model="form.staffName" type="textarea" placeholder="璇疯緭鍏ュ憳宸ュ鍚�"/>
+                            <Field label="閮ㄩ棬id" prop="deptId" v-model="form.deptId" placeholder="璇疯緭鍏ラ儴闂╥d"/>
+                            <Field label="閮ㄩ棬鍚嶇О" prop="deptName" v-model="form.deptName" type="textarea" placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�"/>
+                            <Field label="鍏ヨ亴鏃堕棿" prop="entryTime" v-model="form.entryTime" type="date" />
+                            <Field label="浜嬪亣" prop="personalLeaveDays" v-model="form.personalLeaveDays" placeholder="璇疯緭鍏ヤ簨鍋�"/>
+                            <Field label="璋冧紤" prop="compensatedLeaveDays" v-model="form.compensatedLeaveDays" placeholder="璇疯緭鍏ヨ皟浼�"/>
+                            <Field label="鐥呭亣" prop="sickLeaveDays" v-model="form.sickLeaveDays" placeholder="璇疯緭鍏ョ梾鍋�"/>
+                            <Field label="骞村亣" prop="annualLeaveDays" v-model="form.annualLeaveDays" placeholder="璇疯緭鍏ュ勾鍋�"/>
+                            <Field label="濠氬亣" prop="marriageLeaveDays" v-model="form.marriageLeaveDays" placeholder="璇疯緭鍏ュ鍋�"/>
+                            <Field label="澶囨敞" prop="remark" v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+
+            </el-row>
+
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button type="primary" v-if="pageInfo.type !== 'view'" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    import dialogShow from "./dialogshow";
+    export default {
+        mixins: [form],
+        components: {
+            dialogShow ,
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鍛樺伐鍋囨湡浣欓淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                toString:[
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/vacation/balance/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鍛樺伐鍋囨湡浣欓淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "attendance/vacation/balance/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鍛樺伐鍋囨湡浣欓淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/vacation/balance/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鍛樺伐鍋囨湡浣欓淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    staffId : null,
+                    staffName : "",
+                    deptId : null,
+                    deptName : "",
+                    entryTime : null,
+                    personalLeaveDays : BigDecimal.valueOf(0),
+                    compensatedLeaveDays : BigDecimal.valueOf(0),
+                    sickLeaveDays : BigDecimal.valueOf(0),
+                    annualLeaveDays : BigDecimal.valueOf(0),
+                    marriageLeaveDays : BigDecimal.valueOf(0),
+                    remark : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/vacation/balance/drawershow.vue b/attendance-performance-manager-ui/admin/src/views/attendance/vacation/balance/drawershow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..529939427033a83403f0c9ffe6c9389a0d140174
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/vacation/balance/drawershow.vue
@@ -0,0 +1,126 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-drawer
+            :title="title"
+            :visible.sync="open"
+            :direction="direction"
+            size="50%">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍛樺伐id" prop="staffId" v-model="form.staffId" placeholder="璇疯緭鍏ュ憳宸d"/>
+                            <Field label="鍛樺伐濮撳悕" prop="staffName" v-model="form.staffName" type="textarea" placeholder="璇疯緭鍏ュ憳宸ュ鍚�"/>
+                            <Field label="閮ㄩ棬id" prop="deptId" v-model="form.deptId" placeholder="璇疯緭鍏ラ儴闂╥d"/>
+                            <Field label="閮ㄩ棬鍚嶇О" prop="deptName" v-model="form.deptName" type="textarea" placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�"/>
+                            <Field label="鍏ヨ亴鏃堕棿" prop="entryTime" v-model="form.entryTime" type="date" />
+                            <Field label="浜嬪亣" prop="personalLeaveDays" v-model="form.personalLeaveDays" placeholder="璇疯緭鍏ヤ簨鍋�"/>
+                            <Field label="璋冧紤" prop="compensatedLeaveDays" v-model="form.compensatedLeaveDays" placeholder="璇疯緭鍏ヨ皟浼�"/>
+                            <Field label="鐥呭亣" prop="sickLeaveDays" v-model="form.sickLeaveDays" placeholder="璇疯緭鍏ョ梾鍋�"/>
+                            <Field label="骞村亣" prop="annualLeaveDays" v-model="form.annualLeaveDays" placeholder="璇疯緭鍏ュ勾鍋�"/>
+                            <Field label="濠氬亣" prop="marriageLeaveDays" v-model="form.marriageLeaveDays" placeholder="璇疯緭鍏ュ鍋�"/>
+                            <Field label="澶囨敞" prop="remark" v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+
+            </el-row>
+
+            <form-buttons @submit='submitForm' noCancelBtn />
+        </el-form>
+
+    </el-drawer>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    export default {
+        name: "AttendanceVacationBalanceDetail",
+        mixins: [form],
+        components: {
+
+        },
+        created() {
+            this.changePath("attendance/vacation/balance")
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鍛樺伐鍋囨湡浣欓淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                direction:"rtl",
+                toString:[
+                ],
+                toDate:[
+                    "entryTime",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/vacation/balance/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鍛樺伐鍋囨湡浣欓淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "attendance/vacation/balance/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鍛樺伐鍋囨湡浣欓淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="attendance/vacation/balance/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鍛樺伐鍋囨湡浣欓淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    staffId : null,
+                    staffName : "",
+                    deptId : null,
+                    deptName : "",
+                    entryTime : null,
+                    personalLeaveDays : BigDecimal.valueOf(0),
+                    compensatedLeaveDays : BigDecimal.valueOf(0),
+                    sickLeaveDays : BigDecimal.valueOf(0),
+                    annualLeaveDays : BigDecimal.valueOf(0),
+                    marriageLeaveDays : BigDecimal.valueOf(0),
+                    remark : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/vacation/balance/list.vue b/attendance-performance-manager-ui/admin/src/views/attendance/vacation/balance/list.vue
new file mode 100644
index 0000000000000000000000000000000000000000..7342c20ecf695913856e9fe01055cf30bc757017
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/vacation/balance/list.vue
@@ -0,0 +1,130 @@
+<template>
+    <div class="page">
+        <LayoutTable :data="tableData" :config="tableConfig">
+                    </LayoutTable>
+
+
+        <drawer-show ref="drawerform" @ok="getData" />
+    </div>
+</template>
+
+<script>
+    /** 琛ㄥ崟寮瑰嚭妗嗘ā寮忛渶寮曞叆 */
+    import drawerShow from "./drawershow";
+    import table from "@/assets/mixins/table";
+    export default {
+        name: "AttendanceVacationBalanceList",
+        components: {
+            drawerShow
+},
+        mixins: [table],
+        created() {
+        },
+        methods: {
+            /** 閲嶅啓鏂板鏂规硶 */
+            toAdd(row) {
+                this.$refs.drawerform.add(row);
+            },
+            /** 閲嶅啓缂栬緫鏂规硶 */
+            toEdit(row) {
+                this.$refs.drawerform.edit(row);
+            },
+            /** 閲嶅啓鏌ョ湅鏂规硶 */
+            toView(row) {
+                this.$refs.drawerform.view(row);
+            },
+
+        },
+        data() {
+            return {
+                config: {
+                    search: [
+                        {
+                            name: "staffId",
+                            type: "text",
+                            label: "鍛樺伐id",
+                            fuzzy: true
+                        },
+                        {
+                            name: "deptId",
+                            type: "text",
+                            label: "閮ㄩ棬id",
+                            fuzzy: true
+                        },
+                        {
+                            name: "entryTime",
+                            type: "date",
+                            label: "鍏ヨ亴鏃堕棿",
+                            fuzzy: true
+                        },
+                        {
+                            name: "personalLeaveDays",
+                            type: "text",
+                            label: "浜嬪亣",
+                            fuzzy: true
+                        },
+                        {
+                            name: "compensatedLeaveDays",
+                            type: "text",
+                            label: "璋冧紤",
+                            fuzzy: true
+                        },
+                        {
+                            name: "sickLeaveDays",
+                            type: "text",
+                            label: "鐥呭亣",
+                            fuzzy: true
+                        },
+                        {
+                            name: "annualLeaveDays",
+                            type: "text",
+                            label: "骞村亣",
+                            fuzzy: true
+                        },
+                        {
+                            name: "marriageLeaveDays",
+                            type: "text",
+                            label: "濠氬亣",
+                            fuzzy: true
+                        },
+                    ],
+                    columns: [
+                        {type: "selection", width: 60},
+                        {type: "index",label: "搴忓彿",width: 50},
+
+                        {label: "鍛樺伐id", prop: "staffId", formatter: this.formatter},
+
+                        {label: "鍛樺伐濮撳悕", prop: "staffName"},
+
+                        {label: "閮ㄩ棬id", prop: "deptId", formatter: this.formatter},
+
+                        {label: "閮ㄩ棬鍚嶇О", prop: "deptName"},
+
+                        {label: "鍏ヨ亴鏃堕棿", prop: "entryTime", formatter: this.formatterDate},
+
+                        {label: "浜嬪亣", prop: "personalLeaveDays", formatter: this.formatterMoney},
+
+                        {label: "璋冧紤", prop: "compensatedLeaveDays", formatter: this.formatterMoney},
+
+                        {label: "鐥呭亣", prop: "sickLeaveDays", formatter: this.formatterMoney},
+
+                        {label: "骞村亣", prop: "annualLeaveDays", formatter: this.formatterMoney},
+
+                        {label: "濠氬亣", prop: "marriageLeaveDays", formatter: this.formatterMoney},
+
+                        {label: "鍒涘缓鐢ㄦ埛", prop: "createUserId", formatter: this.formatter},
+                        {
+                            label: "鎿嶄綔",
+                            width: 240,
+                            formatter: row => {
+                                return (
+                                    <table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
+                            );
+                            }
+                        }
+                    ]
+                }
+            };
+        }
+    };
+</script>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/vacation/balance/view.vue b/attendance-performance-manager-ui/admin/src/views/attendance/vacation/balance/view.vue
new file mode 100644
index 0000000000000000000000000000000000000000..78378b69fbbb7d92ecd32b9db2f859093ef5816d
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/vacation/balance/view.vue
@@ -0,0 +1,87 @@
+<template>
+    <layout-view>
+        <el-descriptions  :title="title" :column="column" :size="size" :colon="false" border>
+            <template slot="title">
+                <i class="el-icon-tickets"></i>
+                鍩烘湰璇︾粏淇℃伅
+            </template>
+            <template slot="extra">
+                <el-button type="primary" @click="$router.go(-1)" size="small">杩斿洖</el-button>
+            </template>
+                                    <el-descriptions-item label="鍛樺伐id" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.staffId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍛樺伐濮撳悕" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.staffName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="閮ㄩ棬id" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.deptId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="閮ㄩ棬鍚嶇О" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.deptName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍏ヨ亴鏃堕棿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.entryTime)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="浜嬪亣" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.personalLeaveDays}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="璋冧紤" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.compensatedLeaveDays}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鐥呭亣" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.sickLeaveDays}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="骞村亣" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.annualLeaveDays}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="濠氬亣" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.marriageLeaveDays}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="澶囨敞" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.remark}}
+                        </el-descriptions-item>
+        </el-descriptions>
+
+    </layout-view>
+</template>
+
+<script>
+    import view from "@/assets/mixins/view";
+    export default {
+        mixins: [view],
+        components: {
+        },
+        methods: {
+
+        },
+        data() {
+            return {
+                size:"small",
+                column:2,
+                toString:[
+                ],
+                toArrays: [
+
+                ],
+                toDate: [
+
+                ]
+            }
+        }
+    }
+</script>
+<style lang="less">
+    .labelClass{
+        width: 200px;
+    }
+    .el-descriptions__body{
+        margin-left: 5px;
+        margin-right: 5px;
+        color: #606266;
+        background-color: #FFF;
+    }
+    .contentClass{
+        width: 600px;
+    }
+</style>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/care/template/dialogshow.vue b/attendance-performance-manager-ui/admin/src/views/care/template/dialogshow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..82702928165249e00df0c962200769a7b7133119
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/care/template/dialogshow.vue
@@ -0,0 +1,106 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-dialog :title="title" :visible.sync="open" width="90%" append-to-body>
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍏虫€€绫诲瀷" prop="careType" v-model="form.careType" type="select" :enumData="dict.careType" placeholder="璇烽€夋嫨鍏虫€€绫诲瀷"/>
+                            <Field label="鏄惁鐭俊鎻愮ず" prop="sms" v-model="form.sms" type="select" :enumData="dict.sms" placeholder="璇烽€夋嫨鏄惁鐭俊鎻愮ず"/>
+                            <Field label="鐭俊妯℃澘鍐呭" prop="smsTemplate" v-model="form.smsTemplate" type="textarea" placeholder="璇疯緭鍏ョ煭淇℃ā鏉垮唴瀹�"/>
+
+            </el-row>
+
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button type="primary" v-if="pageInfo.type !== 'view'" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    import dialogShow from "./dialogshow";
+    export default {
+        mixins: [form],
+        components: {
+            dialogShow ,
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鍏虫€€闂€欎俊鎭�",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                toString:[
+                    "careType",
+                    "sms",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="care/template/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鍏虫€€闂€欎俊鎭�";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "care/template/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鍏虫€€闂€欎俊鎭�";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="care/template/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鍏虫€€闂€欎俊鎭缁�";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    careType : 1,
+                    sms : 1,
+                    smsTemplate : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/care/template/drawershow.vue b/attendance-performance-manager-ui/admin/src/views/care/template/drawershow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..0b93ebef1b566139d2f702bb280e28ef66a2ca37
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/care/template/drawershow.vue
@@ -0,0 +1,114 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-drawer
+            :title="title"
+            :visible.sync="open"
+            :direction="direction"
+            size="50%">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍏虫€€绫诲瀷" prop="careType" v-model="form.careType" type="select" :enumData="dict.careType" placeholder="璇烽€夋嫨鍏虫€€绫诲瀷"/>
+                            <Field label="鏄惁鐭俊鎻愮ず" prop="sms" v-model="form.sms" type="select" :enumData="dict.sms" placeholder="璇烽€夋嫨鏄惁鐭俊鎻愮ず"/>
+                            <Field label="鐭俊妯℃澘鍐呭" prop="smsTemplate" v-model="form.smsTemplate" type="textarea" placeholder="璇疯緭鍏ョ煭淇℃ā鏉垮唴瀹�"/>
+
+            </el-row>
+
+            <form-buttons @submit='submitForm' noCancelBtn />
+        </el-form>
+
+    </el-drawer>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    export default {
+        name: "CareTemplateDetail",
+        mixins: [form],
+        components: {
+
+        },
+        created() {
+            this.changePath("care/template")
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鍏虫€€闂€欎俊鎭�",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                direction:"rtl",
+                toString:[
+                    "careType",
+                    "sms",
+                ],
+                toDate:[
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="care/template/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鍏虫€€闂€欎俊鎭�";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "care/template/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鍏虫€€闂€欎俊鎭�";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="care/template/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鍏虫€€闂€欎俊鎭缁�";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    careType : 1,
+                    sms : 1,
+                    smsTemplate : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/care/template/list.vue b/attendance-performance-manager-ui/admin/src/views/care/template/list.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f5493082c69dc9eeee82f6d71a3b181701a2553a
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/care/template/list.vue
@@ -0,0 +1,66 @@
+<template>
+    <div class="page">
+        <LayoutTable :data="tableData" :config="tableConfig">
+                    </LayoutTable>
+
+
+        <drawer-show ref="drawerform" @ok="getData" />
+    </div>
+</template>
+
+<script>
+    /** 琛ㄥ崟寮瑰嚭妗嗘ā寮忛渶寮曞叆 */
+    import drawerShow from "./drawershow";
+    import table from "@/assets/mixins/table";
+    export default {
+        name: "CareTemplateList",
+        components: {
+            drawerShow
+},
+        mixins: [table],
+        created() {
+        },
+        methods: {
+            /** 閲嶅啓鏂板鏂规硶 */
+            toAdd(row) {
+                this.$refs.drawerform.add(row);
+            },
+            /** 閲嶅啓缂栬緫鏂规硶 */
+            toEdit(row) {
+                this.$refs.drawerform.edit(row);
+            },
+            /** 閲嶅啓鏌ョ湅鏂规硶 */
+            toView(row) {
+                this.$refs.drawerform.view(row);
+            },
+
+        },
+        data() {
+            return {
+                config: {
+                    search: [
+                    ],
+                    columns: [
+                        {type: "selection", width: 60},
+                        {type: "index",label: "搴忓彿",width: 50},
+
+                        {label: "鍏虫€€绫诲瀷", prop: "careType",formatter: this.formatter},
+
+                        {label: "鏄惁鐭俊鎻愮ず", prop: "sms",formatter: this.formatter},
+
+                        {label: "鍒涘缓鐢ㄦ埛", prop: "createUserId", formatter: this.formatter},
+                        {
+                            label: "鎿嶄綔",
+                            width: 240,
+                            formatter: row => {
+                                return (
+                                    <table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
+                            );
+                            }
+                        }
+                    ]
+                }
+            };
+        }
+    };
+</script>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/care/template/view.vue b/attendance-performance-manager-ui/admin/src/views/care/template/view.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e83ffe4486e0e66216395b08af0e8292f93cb364
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/care/template/view.vue
@@ -0,0 +1,65 @@
+<template>
+    <layout-view>
+        <el-descriptions  :title="title" :column="column" :size="size" :colon="false" border>
+            <template slot="title">
+                <i class="el-icon-tickets"></i>
+                鍩烘湰璇︾粏淇℃伅
+            </template>
+            <template slot="extra">
+                <el-button type="primary" @click="$router.go(-1)" size="small">杩斿洖</el-button>
+            </template>
+                                    <el-descriptions-item label="鍏虫€€绫诲瀷" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("careType", form.careType) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鏄惁鐭俊鎻愮ず" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("sms", form.sms) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鐭俊妯℃澘鍐呭" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.smsTemplate}}
+                        </el-descriptions-item>
+        </el-descriptions>
+
+    </layout-view>
+</template>
+
+<script>
+    import view from "@/assets/mixins/view";
+    export default {
+        mixins: [view],
+        components: {
+        },
+        methods: {
+
+        },
+        data() {
+            return {
+                size:"small",
+                column:2,
+                toString:[
+                    "careType",
+                    "sms",
+                ],
+                toArrays: [
+
+                ],
+                toDate: [
+
+                ]
+            }
+        }
+    }
+</script>
+<style lang="less">
+    .labelClass{
+        width: 200px;
+    }
+    .el-descriptions__body{
+        margin-left: 5px;
+        margin-right: 5px;
+        color: #606266;
+        background-color: #FFF;
+    }
+    .contentClass{
+        width: 600px;
+    }
+</style>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/dept/drawershow.vue b/attendance-performance-manager-ui/admin/src/views/dept/drawershow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e8f0fba93b64dff96a085e9109f118744ad06d5c
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/dept/drawershow.vue
@@ -0,0 +1,133 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-drawer
+            :title="title"
+            :visible.sync="open"
+            :direction="direction"
+            size="50%">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鐖秈d" prop="parentId" v-model="form.parentId" placeholder="璇疯緭鍏ョ埗id"/>
+                            <Field label="绁栫骇鍒楄〃" prop="ancestors" v-model="form.ancestors" type="textarea" placeholder="璇疯緭鍏ョ绾у垪琛�"/>
+                            <Field label="閮ㄩ棬鍚嶇О" prop="deptName" v-model="form.deptName" type="textarea" placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�"/>
+                            <Field label="閮ㄩ棬鐘舵€�" prop="deptStatus" v-model="form.deptStatus" type="select" :enumData="dict.deptStatus" placeholder="璇烽€夋嫨閮ㄩ棬鐘舵€�"/>
+                            <Field label="椤哄簭" prop="orderNum" v-model="form.orderNum" placeholder="璇疯緭鍏ラ『搴�"/>
+                            <Field label="澶囨敞" prop="remark" v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+
+            </el-row>
+
+            <form-buttons @submit='submitForm' noCancelBtn />
+        </el-form>
+
+    </el-drawer>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    export default {
+        name: "DeptDetail",
+        mixins: [form],
+        components: {
+
+        },
+        created() {
+            this.changePath("dept")
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "閮ㄩ棬淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                direction:"rtl",
+                toString:[
+                    "deptStatus",
+                ],
+                toDate:[
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    ancestors: [
+                        {required: true,message: "璇疯緭鍏ョ绾у垪琛�", trigger: "blur" },
+                        {max: 256,message: "鏈€澶氬彧鑳藉綍鍏�256涓瓧绗�",trigger: "blur",},
+                    ],
+                    deptName: [
+                        {required: true,message: "璇疯緭鍏ラ儴闂ㄥ悕绉�", trigger: "blur" },
+                        {max: 256,message: "鏈€澶氬彧鑳藉綍鍏�256涓瓧绗�",trigger: "blur",},
+                    ],
+                    deptStatus: [
+                        {required: true,message: "璇疯緭鍏ラ儴闂ㄧ姸鎬�", trigger: "blur" },
+                    ],
+                    orderNum: [
+                        {required: true,message: "璇疯緭鍏ラ『搴�", trigger: "blur" },
+                    ],
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="dept/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼閮ㄩ棬淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "dept/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板閮ㄩ棬淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="dept/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "閮ㄩ棬淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    parentId : null,
+                    ancestors : "",
+                    deptName : "",
+                    deptStatus : 1,
+                    orderNum : 0,
+                    remark : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/dept/list.vue b/attendance-performance-manager-ui/admin/src/views/dept/list.vue
index d34a7291aeea6c8a3ff3da027e895b8c6cdd623f..79f13b96fe038d4113588ba232f9503293f4b4b3 100644
--- a/attendance-performance-manager-ui/admin/src/views/dept/list.vue
+++ b/attendance-performance-manager-ui/admin/src/views/dept/list.vue
@@ -1,106 +1,77 @@
 <template>
     <div class="page">
-        <LayoutTable ref="layoutTable" :data="tableData" :config="tableConfig" notDel />
-        <dialog-show ref="dialogform" @ok="getData" />
+        <LayoutTable :data="tableData" :config="tableConfig">
+                    </LayoutTable>
 
+
+        <drawer-show ref="drawerform" @ok="getData" />
     </div>
 </template>
 
 <script>
-    import { handleTree } from "@/assets/utils/index";
-    import Treeselect from "@riophae/vue-treeselect";
-    import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+    /** 琛ㄥ崟寮瑰嚭妗嗘ā寮忛渶寮曞叆 */
+    import drawerShow from "./drawershow";
     import table from "@/assets/mixins/table";
-    import dialogShow from "./dialogshow";
     export default {
-        name: "Dept",
+        name: "DeptList",
+        components: {
+            drawerShow
+},
         mixins: [table],
-        components: { Treeselect, dialogShow },
         created() {
         },
         methods: {
-            afterRender(data) {
-              console.log("data",data)
-                data.data = handleTree(data.data, "id","parentId");
-                this.deptOptions = data.data;
-                this.$refs.layoutTable.showType="treetable"
-            },
-
-            handleAdd(row) {
-                this.$refs.dialogform.add(row, this.deptOptions);
-            },
-
             /** 閲嶅啓鏂板鏂规硶 */
             toAdd(row) {
-              console.log("deptOptions", this.deptOptions)
-              this.$refs.dialogform.add(row, this.deptOptions);
+                this.$refs.drawerform.add(row);
             },
             /** 閲嶅啓缂栬緫鏂规硶 */
             toEdit(row) {
-                this.loading = true;
-                this.$post(this.pageInfo.exclude+"?id="+row.id,{})
-                    .then((res) => {
-                        if (res && res.code && res.code == 1) {
-                            this.deptOptions = handleTree(res.data.result);
-                            this.$refs.dialogform.edit(row, this.deptOptions);
-                            this.loading = false;
-                        }
-                    })
-                    .catch((error) => {
-                        this.$message.error(error.message);
-                    });
+                this.$refs.drawerform.edit(row);
             },
             /** 閲嶅啓鏌ョ湅鏂规硶 */
             toView(row) {
-                this.$refs.dialogform.view(row, this.deptOptions);
+                this.$refs.drawerform.view(row);
             },
-          afterDel(data) {
-              this.getData()
-          },
+
         },
         data() {
             return {
                 config: {
-                    /** 鏍戣〃鏄惁榛樿灞曞紑 */
-                    expand:true,
-                    showType: "treetable",
                     search: [
                         {
-                            name: "deptName",
+                            name: "orderNum",
                             type: "text",
-                            label: "閮ㄩ棬鍚嶇О",
+                            label: "椤哄簭",
                             fuzzy: true
-                        }
+                        },
+                        {
+                            name: "createUserId",
+                            type: "text",
+                            label: "鍒涘缓鐢ㄦ埛",
+                            fuzzy: true
+                        },
                     ],
                     columns: [
+                        {type: "selection", width: 60},
+                        {type: "index",label: "搴忓彿",width: 50},
+
+                        {label: "绁栫骇鍒楄〃", prop: "ancestors"},
+
                         {label: "閮ㄩ棬鍚嶇О", prop: "deptName"},
-                        {label: "閮ㄩ棬鐘舵€�", prop: "deptStatus",formatter:this.formatter},
+
+                        {label: "閮ㄩ棬鐘舵€�", prop: "deptStatus",formatter: this.formatter},
+
+                        {label: "椤哄簭", prop: "orderNum",formatter: this.formatter},
+
+                        {label: "鍒涘缓鐢ㄦ埛", prop: "createUserId", formatter: this.formatter},
                         {
                             label: "鎿嶄綔",
-                            width: 280,
+                            width: 240,
                             formatter: row => {
                                 return (
-                                    <div>
-                                        <el-button
-                                            size="mini"
-                                            type="text"
-                                            icon="el-icon-edit-outline"
-                                            onClick={() => {
-                                                this.handleAdd(row);
-                                            }}
-                                        >
-                                            鏂板
-                                        </el-button>
-                                        <table-buttons
-                                            noAdd
-                                            noView
-                                            row={row}
-                                            onEdit={this.toEdit}
-                                            onView={this.toView}
-                                            onDel={this.toDel}
-                                        />
-                                    </div>
-                                );
+                                    <table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
+                            );
                             }
                         }
                     ]
@@ -108,4 +79,4 @@
             };
         }
     };
-</script>
+</script>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/job/dialogshow.vue b/attendance-performance-manager-ui/admin/src/views/job/dialogshow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c7e6ccd9c39e8328c4c3f55779bb6f758e79f4c7
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/job/dialogshow.vue
@@ -0,0 +1,105 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-dialog :title="title" :visible.sync="open" width="90%" append-to-body>
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍒嗙粍id" prop="groupId" v-model="form.groupId" placeholder="璇疯緭鍏ュ垎缁刬d"/>
+                            <Field label="鍒嗙粍鍚嶇О" prop="groupName" v-model="form.groupName" placeholder="璇疯緭鍏ュ垎缁勫悕绉�"/>
+                            <Field label="鑱屼綅缂栫爜" prop="jobCode" v-model="form.jobCode" placeholder="璇疯緭鍏ヨ亴浣嶇紪鐮�"/>
+                            <Field label="鑱屼綅鍚嶇О" prop="jobName" v-model="form.jobName" placeholder="璇疯緭鍏ヨ亴浣嶅悕绉�"/>
+                            <Field label="澶囨敞" prop="remark" v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+
+            </el-row>
+
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button type="primary" v-if="pageInfo.type !== 'view'" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    import dialogShow from "./dialogshow";
+    export default {
+        mixins: [form],
+        components: {
+            dialogShow ,
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鑱屼綅淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                toString:[
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="job/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鑱屼綅淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "job/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鑱屼綅淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="job/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鑱屼綅淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    groupId : null,
+                    groupName : "",
+                    jobCode : "",
+                    jobName : "",
+                    remark : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/job/drawershow.vue b/attendance-performance-manager-ui/admin/src/views/job/drawershow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..4d3365f19c2a67985b9354f2e61c48f8a5e0dd1d
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/job/drawershow.vue
@@ -0,0 +1,113 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-drawer
+            :title="title"
+            :visible.sync="open"
+            :direction="direction"
+            size="50%">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍒嗙粍id" prop="groupId" v-model="form.groupId" placeholder="璇疯緭鍏ュ垎缁刬d"/>
+                            <Field label="鍒嗙粍鍚嶇О" prop="groupName" v-model="form.groupName" placeholder="璇疯緭鍏ュ垎缁勫悕绉�"/>
+                            <Field label="鑱屼綅缂栫爜" prop="jobCode" v-model="form.jobCode" placeholder="璇疯緭鍏ヨ亴浣嶇紪鐮�"/>
+                            <Field label="鑱屼綅鍚嶇О" prop="jobName" v-model="form.jobName" placeholder="璇疯緭鍏ヨ亴浣嶅悕绉�"/>
+                            <Field label="澶囨敞" prop="remark" v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+
+            </el-row>
+
+            <form-buttons @submit='submitForm' noCancelBtn />
+        </el-form>
+
+    </el-drawer>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    export default {
+        name: "JobDetail",
+        mixins: [form],
+        components: {
+
+        },
+        created() {
+            this.changePath("job")
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鑱屼綅淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                direction:"rtl",
+                toString:[
+                ],
+                toDate:[
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="job/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鑱屼綅淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "job/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鑱屼綅淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="job/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鑱屼綅淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    groupId : null,
+                    groupName : "",
+                    jobCode : "",
+                    jobName : "",
+                    remark : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/job/list.vue b/attendance-performance-manager-ui/admin/src/views/job/list.vue
new file mode 100644
index 0000000000000000000000000000000000000000..dbd44c11f0b82d0255c165918a52a3ea3074979f
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/job/list.vue
@@ -0,0 +1,84 @@
+<template>
+    <div class="page">
+        <LayoutTable :data="tableData" :config="tableConfig">
+                    </LayoutTable>
+
+
+        <drawer-show ref="drawerform" @ok="getData" />
+    </div>
+</template>
+
+<script>
+    /** 琛ㄥ崟寮瑰嚭妗嗘ā寮忛渶寮曞叆 */
+    import drawerShow from "./drawershow";
+    import table from "@/assets/mixins/table";
+    export default {
+        name: "JobList",
+        components: {
+            drawerShow
+},
+        mixins: [table],
+        created() {
+        },
+        methods: {
+            /** 閲嶅啓鏂板鏂规硶 */
+            toAdd(row) {
+                this.$refs.drawerform.add(row);
+            },
+            /** 閲嶅啓缂栬緫鏂规硶 */
+            toEdit(row) {
+                this.$refs.drawerform.edit(row);
+            },
+            /** 閲嶅啓鏌ョ湅鏂规硶 */
+            toView(row) {
+                this.$refs.drawerform.view(row);
+            },
+
+        },
+        data() {
+            return {
+                config: {
+                    search: [
+                        {
+                            name: "groupName",
+                            type: "text",
+                            label: "鍒嗙粍鍚嶇О",
+                            fuzzy: true
+                        },
+                        {
+                            name: "jobCode",
+                            type: "text",
+                            label: "鑱屼綅缂栫爜",
+                            fuzzy: true
+                        },
+                        {
+                            name: "jobName",
+                            type: "text",
+                            label: "鑱屼綅鍚嶇О",
+                            fuzzy: true
+                        },
+                    ],
+                    columns: [
+                        {type: "selection", width: 60},
+                        {type: "index",label: "搴忓彿",width: 50},
+
+                        {label: "鍒嗙粍鍚嶇О", prop: "groupName"},
+
+                        {label: "鑱屼綅缂栫爜", prop: "jobCode"},
+
+                        {label: "鑱屼綅鍚嶇О", prop: "jobName"},
+                        {
+                            label: "鎿嶄綔",
+                            width: 240,
+                            formatter: row => {
+                                return (
+                                    <table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
+                            );
+                            }
+                        }
+                    ]
+                }
+            };
+        }
+    };
+</script>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/job/view.vue b/attendance-performance-manager-ui/admin/src/views/job/view.vue
new file mode 100644
index 0000000000000000000000000000000000000000..351e2d93df56e4ba1d738157b807c244d845c13c
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/job/view.vue
@@ -0,0 +1,69 @@
+<template>
+    <layout-view>
+        <el-descriptions  :title="title" :column="column" :size="size" :colon="false" border>
+            <template slot="title">
+                <i class="el-icon-tickets"></i>
+                鍩烘湰璇︾粏淇℃伅
+            </template>
+            <template slot="extra">
+                <el-button type="primary" @click="$router.go(-1)" size="small">杩斿洖</el-button>
+            </template>
+                                    <el-descriptions-item label="鍒嗙粍id" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.groupId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍒嗙粍鍚嶇О" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.groupName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱屼綅缂栫爜" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.jobCode}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱屼綅鍚嶇О" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.jobName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="澶囨敞" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.remark}}
+                        </el-descriptions-item>
+        </el-descriptions>
+
+    </layout-view>
+</template>
+
+<script>
+    import view from "@/assets/mixins/view";
+    export default {
+        mixins: [view],
+        components: {
+        },
+        methods: {
+
+        },
+        data() {
+            return {
+                size:"small",
+                column:2,
+                toString:[
+                ],
+                toArrays: [
+
+                ],
+                toDate: [
+
+                ]
+            }
+        }
+    }
+</script>
+<style lang="less">
+    .labelClass{
+        width: 200px;
+    }
+    .el-descriptions__body{
+        margin-left: 5px;
+        margin-right: 5px;
+        color: #606266;
+        background-color: #FFF;
+    }
+    .contentClass{
+        width: 600px;
+    }
+</style>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/adjust/log/dialogshow.vue b/attendance-performance-manager-ui/admin/src/views/staff/adjust/log/dialogshow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..fec43856a86ded33b0663c2eb8e4ccd5720c32fa
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/adjust/log/dialogshow.vue
@@ -0,0 +1,149 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-dialog :title="title" :visible.sync="open" width="90%" append-to-body>
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍛樺伐ID" prop="staffId" v-model="form.staffId" placeholder="璇疯緭鍏ュ憳宸D"/>
+                            <Field label="鍛樺伐濮撳悕" prop="fullName" v-model="form.fullName" placeholder="璇疯緭鍏ュ憳宸ュ鍚�"/>
+                            <Field label="鎬у埆1鐢�2濂�" prop="gender" v-model="form.gender" type="select" :enumData="dict.gender" placeholder="璇烽€夋嫨鎬у埆1鐢�2濂�"/>
+                            <Field label="鍑虹敓鏃ユ湡" prop="birthday" v-model="form.birthday" type="date" />
+                            <Field label="鐓х墖" prop="photoPath" v-model="form.photoPath" type="textarea" placeholder="璇疯緭鍏ョ収鐗�"/>
+                            <Field label="鑱旂郴鐢佃瘽" prop="phoneNumber" v-model="form.phoneNumber" placeholder="璇疯緭鍏ヨ仈绯荤數璇�"/>
+                            <Field label="韬唤璇佸彿鐮�" prop="idCard" v-model="form.idCard" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙风爜"/>
+                            <Field label="宸ュ彿" prop="workNum" v-model="form.workNum" placeholder="璇疯緭鍏ュ伐鍙�"/>
+                            <Field label="鏀挎不闈㈣矊 " prop="politicalstatus" v-model="form.politicalstatus" type="select" :enumData="dict.politicalstatus" placeholder="璇烽€夋嫨鏀挎不闈㈣矊 "/>
+                            <Field label="鎵€灞為儴闂�" prop="deptId" v-model="form.deptId" placeholder="璇疯緭鍏ユ墍灞為儴闂�"/>
+                            <Field label="鎵€灞為儴闂ㄥ悕绉�" prop="deptName" v-model="form.deptName" placeholder="璇疯緭鍏ユ墍灞為儴闂ㄥ悕绉�"/>
+                            <Field label="鑱屼綅ID" prop="jobId" v-model="form.jobId" placeholder="璇疯緭鍏ヨ亴浣岻D"/>
+                            <Field label="鑱屼綅鍚嶇О" prop="jobName" v-model="form.jobName" placeholder="璇疯緭鍏ヨ亴浣嶅悕绉�"/>
+                            <Field label="鍛樺伐绫诲瀷1鍏ㄨ亴2鍏艰亴3瀹炰範" prop="staffType" v-model="form.staffType" type="select" :enumData="dict.staffType" placeholder="璇烽€夋嫨鍛樺伐绫诲瀷1鍏ㄨ亴2鍏艰亴3瀹炰範"/>
+                            <Field label="鍛樺伐鐘舵€�1姝e紡2璇曠敤3绂昏亴" prop="status" v-model="form.status" type="select" :enumData="dict.status" placeholder="璇烽€夋嫨鍛樺伐鐘舵€�1姝e紡2璇曠敤3绂昏亴"/>
+                            <Field label="鍏ヨ亴鏃堕棿" prop="entryDate" v-model="form.entryDate" type="date" />
+                            <Field label="璋冨矖鍚庢墍灞為儴闂�" prop="newDeptId" v-model="form.newDeptId" placeholder="璇疯緭鍏ヨ皟宀楀悗鎵€灞為儴闂�"/>
+                            <Field label="璋冨矖鍚庢墍灞為儴闂ㄥ悕绉�" prop="newDeptName" v-model="form.newDeptName" placeholder="璇疯緭鍏ヨ皟宀楀悗鎵€灞為儴闂ㄥ悕绉�"/>
+                            <Field label="璋冨矖鍚庤亴浣岻D" prop="newJobId" v-model="form.newJobId" placeholder="璇疯緭鍏ヨ皟宀楀悗鑱屼綅ID"/>
+                            <Field label="璋冨矖鍚庤亴浣嶅悕绉�" prop="newJobName" v-model="form.newJobName" placeholder="璇疯緭鍏ヨ皟宀楀悗鑱屼綅鍚嶇О"/>
+                            <Field label="瀹℃牳鐘舵€�0寰呭鏍�1閫氳繃2鎷掔粷" prop="auditStatus" v-model="form.auditStatus" type="select" :enumData="dict.auditStatus" placeholder="璇烽€夋嫨瀹℃牳鐘舵€�0寰呭鏍�1閫氳繃2鎷掔粷"/>
+
+            </el-row>
+
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button type="primary" v-if="pageInfo.type !== 'view'" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    import dialogShow from "./dialogshow";
+    export default {
+        mixins: [form],
+        components: {
+            dialogShow ,
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鍛樺伐璋冨矖淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                toString:[
+                    "gender",
+                    "politicalstatus",
+                    "staffType",
+                    "status",
+                    "auditStatus",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    fullName: [
+                        {required: true,message: "璇疯緭鍏ュ憳宸ュ鍚�", trigger: "blur" },
+                        {max: 64,message: "鏈€澶氬彧鑳藉綍鍏�64涓瓧绗�",trigger: "blur",},
+                    ],
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/adjust/log/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鍛樺伐璋冨矖淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "staff/adjust/log/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鍛樺伐璋冨矖淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/adjust/log/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鍛樺伐璋冨矖淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    staffId : null,
+                    fullName : "",
+                    gender : 1,
+                    birthday : null,
+                    photoPath : "",
+                    phoneNumber : "",
+                    idCard : "",
+                    workNum : "",
+                    politicalstatus : 1,
+                    deptId : null,
+                    deptName : "",
+                    jobId : null,
+                    jobName : "",
+                    staffType : 1,
+                    status : 1,
+                    entryDate : null,
+                    newDeptId : null,
+                    newDeptName : "",
+                    newJobId : null,
+                    newJobName : "",
+                    auditStatus : 0,
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/adjust/log/drawershow.vue b/attendance-performance-manager-ui/admin/src/views/staff/adjust/log/drawershow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..d575bc8839c5f590db4f1d9e0373ac83aa1d876c
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/adjust/log/drawershow.vue
@@ -0,0 +1,159 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-drawer
+            :title="title"
+            :visible.sync="open"
+            :direction="direction"
+            size="50%">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍛樺伐ID" prop="staffId" v-model="form.staffId" placeholder="璇疯緭鍏ュ憳宸D"/>
+                            <Field label="鍛樺伐濮撳悕" prop="fullName" v-model="form.fullName" placeholder="璇疯緭鍏ュ憳宸ュ鍚�"/>
+                            <Field label="鎬у埆1鐢�2濂�" prop="gender" v-model="form.gender" type="select" :enumData="dict.gender" placeholder="璇烽€夋嫨鎬у埆1鐢�2濂�"/>
+                            <Field label="鍑虹敓鏃ユ湡" prop="birthday" v-model="form.birthday" type="date" />
+                            <Field label="鐓х墖" prop="photoPath" v-model="form.photoPath" type="textarea" placeholder="璇疯緭鍏ョ収鐗�"/>
+                            <Field label="鑱旂郴鐢佃瘽" prop="phoneNumber" v-model="form.phoneNumber" placeholder="璇疯緭鍏ヨ仈绯荤數璇�"/>
+                            <Field label="韬唤璇佸彿鐮�" prop="idCard" v-model="form.idCard" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙风爜"/>
+                            <Field label="宸ュ彿" prop="workNum" v-model="form.workNum" placeholder="璇疯緭鍏ュ伐鍙�"/>
+                            <Field label="鏀挎不闈㈣矊 " prop="politicalstatus" v-model="form.politicalstatus" type="select" :enumData="dict.politicalstatus" placeholder="璇烽€夋嫨鏀挎不闈㈣矊 "/>
+                            <Field label="鎵€灞為儴闂�" prop="deptId" v-model="form.deptId" placeholder="璇疯緭鍏ユ墍灞為儴闂�"/>
+                            <Field label="鎵€灞為儴闂ㄥ悕绉�" prop="deptName" v-model="form.deptName" placeholder="璇疯緭鍏ユ墍灞為儴闂ㄥ悕绉�"/>
+                            <Field label="鑱屼綅ID" prop="jobId" v-model="form.jobId" placeholder="璇疯緭鍏ヨ亴浣岻D"/>
+                            <Field label="鑱屼綅鍚嶇О" prop="jobName" v-model="form.jobName" placeholder="璇疯緭鍏ヨ亴浣嶅悕绉�"/>
+                            <Field label="鍛樺伐绫诲瀷1鍏ㄨ亴2鍏艰亴3瀹炰範" prop="staffType" v-model="form.staffType" type="select" :enumData="dict.staffType" placeholder="璇烽€夋嫨鍛樺伐绫诲瀷1鍏ㄨ亴2鍏艰亴3瀹炰範"/>
+                            <Field label="鍛樺伐鐘舵€�1姝e紡2璇曠敤3绂昏亴" prop="status" v-model="form.status" type="select" :enumData="dict.status" placeholder="璇烽€夋嫨鍛樺伐鐘舵€�1姝e紡2璇曠敤3绂昏亴"/>
+                            <Field label="鍏ヨ亴鏃堕棿" prop="entryDate" v-model="form.entryDate" type="date" />
+                            <Field label="璋冨矖鍚庢墍灞為儴闂�" prop="newDeptId" v-model="form.newDeptId" placeholder="璇疯緭鍏ヨ皟宀楀悗鎵€灞為儴闂�"/>
+                            <Field label="璋冨矖鍚庢墍灞為儴闂ㄥ悕绉�" prop="newDeptName" v-model="form.newDeptName" placeholder="璇疯緭鍏ヨ皟宀楀悗鎵€灞為儴闂ㄥ悕绉�"/>
+                            <Field label="璋冨矖鍚庤亴浣岻D" prop="newJobId" v-model="form.newJobId" placeholder="璇疯緭鍏ヨ皟宀楀悗鑱屼綅ID"/>
+                            <Field label="璋冨矖鍚庤亴浣嶅悕绉�" prop="newJobName" v-model="form.newJobName" placeholder="璇疯緭鍏ヨ皟宀楀悗鑱屼綅鍚嶇О"/>
+                            <Field label="瀹℃牳鐘舵€�0寰呭鏍�1閫氳繃2鎷掔粷" prop="auditStatus" v-model="form.auditStatus" type="select" :enumData="dict.auditStatus" placeholder="璇烽€夋嫨瀹℃牳鐘舵€�0寰呭鏍�1閫氳繃2鎷掔粷"/>
+
+            </el-row>
+
+            <form-buttons @submit='submitForm' noCancelBtn />
+        </el-form>
+
+    </el-drawer>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    export default {
+        name: "StaffAdjustLogDetail",
+        mixins: [form],
+        components: {
+
+        },
+        created() {
+            this.changePath("staff/adjust/log")
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鍛樺伐璋冨矖淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                direction:"rtl",
+                toString:[
+                    "gender",
+                    "politicalstatus",
+                    "staffType",
+                    "status",
+                    "auditStatus",
+                ],
+                toDate:[
+                    "birthday",
+                    "entryDate",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    fullName: [
+                        {required: true,message: "璇疯緭鍏ュ憳宸ュ鍚�", trigger: "blur" },
+                        {max: 64,message: "鏈€澶氬彧鑳藉綍鍏�64涓瓧绗�",trigger: "blur",},
+                    ],
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/adjust/log/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鍛樺伐璋冨矖淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "staff/adjust/log/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鍛樺伐璋冨矖淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/adjust/log/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鍛樺伐璋冨矖淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    staffId : null,
+                    fullName : "",
+                    gender : 1,
+                    birthday : null,
+                    photoPath : "",
+                    phoneNumber : "",
+                    idCard : "",
+                    workNum : "",
+                    politicalstatus : 1,
+                    deptId : null,
+                    deptName : "",
+                    jobId : null,
+                    jobName : "",
+                    staffType : 1,
+                    status : 1,
+                    entryDate : null,
+                    newDeptId : null,
+                    newDeptName : "",
+                    newJobId : null,
+                    newJobName : "",
+                    auditStatus : 0,
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/adjust/log/list.vue b/attendance-performance-manager-ui/admin/src/views/staff/adjust/log/list.vue
new file mode 100644
index 0000000000000000000000000000000000000000..24a186b18d0b2221249d92ec749c140aef2fdc2f
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/adjust/log/list.vue
@@ -0,0 +1,112 @@
+<template>
+    <div class="page">
+        <LayoutTable :data="tableData" :config="tableConfig">
+                    </LayoutTable>
+
+
+        <drawer-show ref="drawerform" @ok="getData" />
+    </div>
+</template>
+
+<script>
+    /** 琛ㄥ崟寮瑰嚭妗嗘ā寮忛渶寮曞叆 */
+    import drawerShow from "./drawershow";
+    import table from "@/assets/mixins/table";
+    export default {
+        name: "StaffAdjustLogList",
+        components: {
+            drawerShow
+},
+        mixins: [table],
+        created() {
+        },
+        methods: {
+            /** 閲嶅啓鏂板鏂规硶 */
+            toAdd(row) {
+                this.$refs.drawerform.add(row);
+            },
+            /** 閲嶅啓缂栬緫鏂规硶 */
+            toEdit(row) {
+                this.$refs.drawerform.edit(row);
+            },
+            /** 閲嶅啓鏌ョ湅鏂规硶 */
+            toView(row) {
+                this.$refs.drawerform.view(row);
+            },
+
+        },
+        data() {
+            return {
+                config: {
+                    search: [
+                        {
+                            name: "fullName",
+                            type: "text",
+                            label: "鍛樺伐濮撳悕",
+                            fuzzy: true
+                        },
+                        {
+                            name: "gender",
+                            type: "text",
+                            label: "鎬у埆1鐢�2濂�",
+                            fuzzy: true
+                        },
+                        {
+                            name: "politicalstatus",
+                            type: "select",
+                            label: "鏀挎不闈㈣矊 ",
+                            fuzzy: true
+                        },
+                        {
+                            name: "staffType",
+                            type: "text",
+                            label: "鍛樺伐绫诲瀷1鍏ㄨ亴2鍏艰亴3瀹炰範",
+                            fuzzy: true
+                        },
+                        {
+                            name: "status",
+                            type: "text",
+                            label: "鍛樺伐鐘舵€�1姝e紡2璇曠敤3绂昏亴",
+                            fuzzy: true
+                        },
+                        {
+                            name: "auditStatus",
+                            type: "text",
+                            label: "瀹℃牳鐘舵€�0寰呭鏍�1閫氳繃2鎷掔粷",
+                            fuzzy: true
+                        },
+                    ],
+                    columns: [
+                        {type: "selection", width: 60},
+                        {type: "index",label: "搴忓彿",width: 50},
+
+                        {label: "鍛樺伐濮撳悕", prop: "fullName"},
+
+                        {label: "鎬у埆1鐢�2濂�", prop: "gender",formatter: this.formatter},
+
+                        {label: "鏀挎不闈㈣矊 ", prop: "politicalstatus",formatter: this.formatter},
+
+                        {label: "鍛樺伐绫诲瀷1鍏ㄨ亴2鍏艰亴3瀹炰範", prop: "staffType",formatter: this.formatter},
+
+                        {label: "鍛樺伐鐘舵€�1姝e紡2璇曠敤3绂昏亴", prop: "status",formatter: this.formatter},
+
+                        {label: "鍏ヨ亴鏃堕棿", prop: "entryDate", formatter: this.formatterDate},
+
+                        {label: "瀹℃牳鐘舵€�0寰呭鏍�1閫氳繃2鎷掔粷", prop: "auditStatus",formatter: this.formatter},
+
+                        {label: "鍒涘缓鐢ㄦ埛", prop: "createUserId", formatter: this.formatter},
+                        {
+                            label: "鎿嶄綔",
+                            width: 240,
+                            formatter: row => {
+                                return (
+                                    <table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
+                            );
+                            }
+                        }
+                    ]
+                }
+            };
+        }
+    };
+</script>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/adjust/log/view.vue b/attendance-performance-manager-ui/admin/src/views/staff/adjust/log/view.vue
new file mode 100644
index 0000000000000000000000000000000000000000..d1c75bb2aae6a211db8b2f39a19fcbe257bd0d5c
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/adjust/log/view.vue
@@ -0,0 +1,122 @@
+<template>
+    <layout-view>
+        <el-descriptions  :title="title" :column="column" :size="size" :colon="false" border>
+            <template slot="title">
+                <i class="el-icon-tickets"></i>
+                鍩烘湰璇︾粏淇℃伅
+            </template>
+            <template slot="extra">
+                <el-button type="primary" @click="$router.go(-1)" size="small">杩斿洖</el-button>
+            </template>
+                                    <el-descriptions-item label="鍛樺伐ID" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.staffId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍛樺伐濮撳悕" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.fullName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎬у埆1鐢�2濂�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.gender}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍑虹敓鏃ユ湡" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.birthday)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鐓х墖" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.photoPath}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱旂郴鐢佃瘽" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.phoneNumber}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="韬唤璇佸彿鐮�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.idCard}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="宸ュ彿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.workNum}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鏀挎不闈㈣矊 " label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("politicalstatus", form.politicalstatus) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎵€灞為儴闂�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.deptId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎵€灞為儴闂ㄥ悕绉�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.deptName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱屼綅ID" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.jobId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱屼綅鍚嶇О" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.jobName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍛樺伐绫诲瀷1鍏ㄨ亴2鍏艰亴3瀹炰範" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.staffType}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍛樺伐鐘舵€�1姝e紡2璇曠敤3绂昏亴" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.status}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍏ヨ亴鏃堕棿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.entryDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="璋冨矖鍚庢墍灞為儴闂�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.newDeptId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="璋冨矖鍚庢墍灞為儴闂ㄥ悕绉�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.newDeptName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="璋冨矖鍚庤亴浣岻D" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.newJobId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="璋冨矖鍚庤亴浣嶅悕绉�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.newJobName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="瀹℃牳鐘舵€�0寰呭鏍�1閫氳繃2鎷掔粷" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.auditStatus}}
+                        </el-descriptions-item>
+        </el-descriptions>
+
+    </layout-view>
+</template>
+
+<script>
+    import view from "@/assets/mixins/view";
+    export default {
+        mixins: [view],
+        components: {
+        },
+        methods: {
+
+        },
+        data() {
+            return {
+                size:"small",
+                column:2,
+                toString:[
+                    "gender",
+                    "politicalstatus",
+                    "staffType",
+                    "status",
+                    "auditStatus",
+                ],
+                toArrays: [
+
+                ],
+                toDate: [
+
+                ]
+            }
+        }
+    }
+</script>
+<style lang="less">
+    .labelClass{
+        width: 200px;
+    }
+    .el-descriptions__body{
+        margin-left: 5px;
+        margin-right: 5px;
+        color: #606266;
+        background-color: #FFF;
+    }
+    .contentClass{
+        width: 600px;
+    }
+</style>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/black/dialogshow.vue b/attendance-performance-manager-ui/admin/src/views/staff/black/dialogshow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..db4dcb637cba3e6e47a6714ac539d396595989c6
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/black/dialogshow.vue
@@ -0,0 +1,117 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-dialog :title="title" :visible.sync="open" width="90%" append-to-body>
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍛樺伐濮撳悕" prop="staffName" v-model="form.staffName" placeholder="璇疯緭鍏ュ憳宸ュ鍚�"/>
+                            <Field label="鑱旂郴鐢佃瘽" prop="phoneNumber" v-model="form.phoneNumber" placeholder="璇疯緭鍏ヨ仈绯荤數璇�"/>
+                            <Field label="韬唤璇佸彿鐮�" prop="idCard" v-model="form.idCard" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙风爜"/>
+                            <Field label="绂昏亴鏃堕棿" prop="leaveDate" v-model="form.leaveDate" type="date" />
+                            <Field label="绂昏亴鍘熷洜" prop="leaveReason" v-model="form.leaveReason" type="textarea" placeholder="璇疯緭鍏ョ鑱屽師鍥�"/>
+                            <Field label="鎷夐粦鏃堕棿" prop="blackDate" v-model="form.blackDate" type="date" />
+                            <Field label="鎷夐粦鍘熷洜" prop="blackReason" v-model="form.blackReason" type="textarea" placeholder="璇疯緭鍏ユ媺榛戝師鍥�"/>
+
+            </el-row>
+
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button type="primary" v-if="pageInfo.type !== 'view'" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    import dialogShow from "./dialogshow";
+    export default {
+        mixins: [form],
+        components: {
+            dialogShow ,
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鍛樺伐榛戝悕鍗曚俊鎭�",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                toString:[
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    staffName: [
+                        {required: true,message: "璇疯緭鍏ュ憳宸ュ鍚�", trigger: "blur" },
+                        {max: 64,message: "鏈€澶氬彧鑳藉綍鍏�64涓瓧绗�",trigger: "blur",},
+                    ],
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/black/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鍛樺伐榛戝悕鍗曚俊鎭�";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "staff/black/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鍛樺伐榛戝悕鍗曚俊鎭�";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/black/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鍛樺伐榛戝悕鍗曚俊鎭缁�";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    staffId : null,
+                    staffName : "",
+                    phoneNumber : "",
+                    idCard : "",
+                    leaveDate : null,
+                    leaveReason : "",
+                    blackDate : null,
+                    blackReason : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/black/drawershow.vue b/attendance-performance-manager-ui/admin/src/views/staff/black/drawershow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..9c4e4ac3e5d02dce8df631b347f79b50fe8ea58f
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/black/drawershow.vue
@@ -0,0 +1,127 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-drawer
+            :title="title"
+            :visible.sync="open"
+            :direction="direction"
+            size="50%">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍛樺伐濮撳悕" prop="staffName" v-model="form.staffName" placeholder="璇疯緭鍏ュ憳宸ュ鍚�"/>
+                            <Field label="鑱旂郴鐢佃瘽" prop="phoneNumber" v-model="form.phoneNumber" placeholder="璇疯緭鍏ヨ仈绯荤數璇�"/>
+                            <Field label="韬唤璇佸彿鐮�" prop="idCard" v-model="form.idCard" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙风爜"/>
+                            <Field label="绂昏亴鏃堕棿" prop="leaveDate" v-model="form.leaveDate" type="date" />
+                            <Field label="绂昏亴鍘熷洜" prop="leaveReason" v-model="form.leaveReason" type="textarea" placeholder="璇疯緭鍏ョ鑱屽師鍥�"/>
+                            <Field label="鎷夐粦鏃堕棿" prop="blackDate" v-model="form.blackDate" type="date" />
+                            <Field label="鎷夐粦鍘熷洜" prop="blackReason" v-model="form.blackReason" type="textarea" placeholder="璇疯緭鍏ユ媺榛戝師鍥�"/>
+
+            </el-row>
+
+            <form-buttons @submit='submitForm' noCancelBtn />
+        </el-form>
+
+    </el-drawer>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    export default {
+        name: "StaffBlackDetail",
+        mixins: [form],
+        components: {
+
+        },
+        created() {
+            this.changePath("staff/black")
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鍛樺伐榛戝悕鍗曚俊鎭�",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                direction:"rtl",
+                toString:[
+                ],
+                toDate:[
+                    "leaveDate",
+                    "blackDate",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    staffName: [
+                        {required: true,message: "璇疯緭鍏ュ憳宸ュ鍚�", trigger: "blur" },
+                        {max: 64,message: "鏈€澶氬彧鑳藉綍鍏�64涓瓧绗�",trigger: "blur",},
+                    ],
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/black/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鍛樺伐榛戝悕鍗曚俊鎭�";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "staff/black/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鍛樺伐榛戝悕鍗曚俊鎭�";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/black/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鍛樺伐榛戝悕鍗曚俊鎭缁�";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    staffId : null,
+                    staffName : "",
+                    phoneNumber : "",
+                    idCard : "",
+                    leaveDate : null,
+                    leaveReason : "",
+                    blackDate : null,
+                    blackReason : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/black/list.vue b/attendance-performance-manager-ui/admin/src/views/staff/black/list.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c9e4172293caaf477dc37ae72856b59e76421b6f
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/black/list.vue
@@ -0,0 +1,74 @@
+<template>
+    <div class="page">
+        <LayoutTable :data="tableData" :config="tableConfig">
+                    </LayoutTable>
+
+
+        <drawer-show ref="drawerform" @ok="getData" />
+    </div>
+</template>
+
+<script>
+    /** 琛ㄥ崟寮瑰嚭妗嗘ā寮忛渶寮曞叆 */
+    import drawerShow from "./drawershow";
+    import table from "@/assets/mixins/table";
+    export default {
+        name: "StaffBlackList",
+        components: {
+            drawerShow
+},
+        mixins: [table],
+        created() {
+        },
+        methods: {
+            /** 閲嶅啓鏂板鏂规硶 */
+            toAdd(row) {
+                this.$refs.drawerform.add(row);
+            },
+            /** 閲嶅啓缂栬緫鏂规硶 */
+            toEdit(row) {
+                this.$refs.drawerform.edit(row);
+            },
+            /** 閲嶅啓鏌ョ湅鏂规硶 */
+            toView(row) {
+                this.$refs.drawerform.view(row);
+            },
+
+        },
+        data() {
+            return {
+                config: {
+                    search: [
+                        {
+                            name: "staffName",
+                            type: "text",
+                            label: "鍛樺伐濮撳悕",
+                            fuzzy: true
+                        },
+                    ],
+                    columns: [
+                        {type: "selection", width: 60},
+                        {type: "index",label: "搴忓彿",width: 50},
+
+                        {label: "鍛樺伐濮撳悕", prop: "staffName"},
+
+                        {label: "绂昏亴鏃堕棿", prop: "leaveDate", formatter: this.formatterDate},
+
+                        {label: "鎷夐粦鏃堕棿", prop: "blackDate", formatter: this.formatterDate},
+
+                        {label: "鍒涘缓鐢ㄦ埛", prop: "createUserId", formatter: this.formatter},
+                        {
+                            label: "鎿嶄綔",
+                            width: 240,
+                            formatter: row => {
+                                return (
+                                    <table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
+                            );
+                            }
+                        }
+                    ]
+                }
+            };
+        }
+    };
+</script>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/black/view.vue b/attendance-performance-manager-ui/admin/src/views/staff/black/view.vue
new file mode 100644
index 0000000000000000000000000000000000000000..7982ba201db17c942618b1825977a2d872f8aff8
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/black/view.vue
@@ -0,0 +1,75 @@
+<template>
+    <layout-view>
+        <el-descriptions  :title="title" :column="column" :size="size" :colon="false" border>
+            <template slot="title">
+                <i class="el-icon-tickets"></i>
+                鍩烘湰璇︾粏淇℃伅
+            </template>
+            <template slot="extra">
+                <el-button type="primary" @click="$router.go(-1)" size="small">杩斿洖</el-button>
+            </template>
+                                    <el-descriptions-item label="鍛樺伐濮撳悕" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.staffName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱旂郴鐢佃瘽" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.phoneNumber}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="韬唤璇佸彿鐮�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.idCard}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="绂昏亴鏃堕棿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.leaveDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="绂昏亴鍘熷洜" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.leaveReason}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎷夐粦鏃堕棿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.blackDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎷夐粦鍘熷洜" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.blackReason}}
+                        </el-descriptions-item>
+        </el-descriptions>
+
+    </layout-view>
+</template>
+
+<script>
+    import view from "@/assets/mixins/view";
+    export default {
+        mixins: [view],
+        components: {
+        },
+        methods: {
+
+        },
+        data() {
+            return {
+                size:"small",
+                column:2,
+                toString:[
+                ],
+                toArrays: [
+
+                ],
+                toDate: [
+
+                ]
+            }
+        }
+    }
+</script>
+<style lang="less">
+    .labelClass{
+        width: 200px;
+    }
+    .el-descriptions__body{
+        margin-left: 5px;
+        margin-right: 5px;
+        color: #606266;
+        background-color: #FFF;
+    }
+    .contentClass{
+        width: 600px;
+    }
+</style>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/care/dialogshow.vue b/attendance-performance-manager-ui/admin/src/views/staff/care/dialogshow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..9a5b9d1e9e3a880cd3cc3dab3f24a24c60387150
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/care/dialogshow.vue
@@ -0,0 +1,127 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-dialog :title="title" :visible.sync="open" width="90%" append-to-body>
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍛樺伐濮撳悕" prop="staffName" v-model="form.staffName" placeholder="璇疯緭鍏ュ憳宸ュ鍚�"/>
+                            <Field label="鍑虹敓鏃ユ湡" prop="birthday" v-model="form.birthday" type="date" />
+                            <Field label="鎵€灞為儴闂�" prop="deptId" v-model="form.deptId" placeholder="璇疯緭鍏ユ墍灞為儴闂�"/>
+                            <Field label="鎵€灞為儴闂ㄥ悕绉�" prop="deptName" v-model="form.deptName" placeholder="璇疯緭鍏ユ墍灞為儴闂ㄥ悕绉�"/>
+                            <Field label="鑱屼綅ID" prop="jobId" v-model="form.jobId" placeholder="璇疯緭鍏ヨ亴浣岻D"/>
+                            <Field label="鑱屼綅鍚嶇О" prop="jobName" v-model="form.jobName" placeholder="璇疯緭鍏ヨ亴浣嶅悕绉�"/>
+                            <Field label="鍏ヨ亴鏃堕棿" prop="entryDate" v-model="form.entryDate" type="date" />
+                            <Field label="鍏虫€€绫诲瀷" prop="careType" v-model="form.careType" type="select" :enumData="dict.careType" placeholder="璇烽€夋嫨鍏虫€€绫诲瀷"/>
+                            <Field label="鍙戦€佺姸鎬�" prop="sendStatus" v-model="form.sendStatus" type="select" :enumData="dict.sendStatus" placeholder="璇烽€夋嫨鍙戦€佺姸鎬�"/>
+                            <Field label="鍏虫€€鍐呭"><editor v-model="form.content" :min-height="256"/></Field>
+
+            </el-row>
+
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button type="primary" v-if="pageInfo.type !== 'view'" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    import dialogShow from "./dialogshow";
+    import Editor from '@/components/Editor';
+    export default {
+        mixins: [form],
+        components: {
+            dialogShow ,
+            Editor,
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鍛樺伐鍏虫€€淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                toString:[
+                    "careType",
+                    "sendStatus",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    staffName: [
+                        {required: true,message: "璇疯緭鍏ュ憳宸ュ鍚�", trigger: "blur" },
+                        {max: 64,message: "鏈€澶氬彧鑳藉綍鍏�64涓瓧绗�",trigger: "blur",},
+                    ],
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/care/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鍛樺伐鍏虫€€淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "staff/care/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鍛樺伐鍏虫€€淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/care/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鍛樺伐鍏虫€€淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    staffId : null,
+                    staffName : "",
+                    birthday : null,
+                    deptId : null,
+                    deptName : "",
+                    jobId : null,
+                    jobName : "",
+                    entryDate : null,
+                    careType : 1,
+                    sendStatus : 0,
+                    content : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/care/drawershow.vue b/attendance-performance-manager-ui/admin/src/views/staff/care/drawershow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..369c278997000f8fa895462311443defc0ff7caf
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/care/drawershow.vue
@@ -0,0 +1,135 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-drawer
+            :title="title"
+            :visible.sync="open"
+            :direction="direction"
+            size="50%">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍛樺伐濮撳悕" prop="staffName" v-model="form.staffName" placeholder="璇疯緭鍏ュ憳宸ュ鍚�"/>
+                            <Field label="鍑虹敓鏃ユ湡" prop="birthday" v-model="form.birthday" type="date" />
+                            <Field label="鎵€灞為儴闂�" prop="deptId" v-model="form.deptId" placeholder="璇疯緭鍏ユ墍灞為儴闂�"/>
+                            <Field label="鎵€灞為儴闂ㄥ悕绉�" prop="deptName" v-model="form.deptName" placeholder="璇疯緭鍏ユ墍灞為儴闂ㄥ悕绉�"/>
+                            <Field label="鑱屼綅ID" prop="jobId" v-model="form.jobId" placeholder="璇疯緭鍏ヨ亴浣岻D"/>
+                            <Field label="鑱屼綅鍚嶇О" prop="jobName" v-model="form.jobName" placeholder="璇疯緭鍏ヨ亴浣嶅悕绉�"/>
+                            <Field label="鍏ヨ亴鏃堕棿" prop="entryDate" v-model="form.entryDate" type="date" />
+                            <Field label="鍏虫€€绫诲瀷" prop="careType" v-model="form.careType" type="select" :enumData="dict.careType" placeholder="璇烽€夋嫨鍏虫€€绫诲瀷"/>
+                            <Field label="鍙戦€佺姸鎬�" prop="sendStatus" v-model="form.sendStatus" type="select" :enumData="dict.sendStatus" placeholder="璇烽€夋嫨鍙戦€佺姸鎬�"/>
+                            <Field label="鍏虫€€鍐呭"><editor v-model="form.content" :min-height="256"/></Field>
+
+            </el-row>
+
+            <form-buttons @submit='submitForm' noCancelBtn />
+        </el-form>
+
+    </el-drawer>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    export default {
+        name: "StaffCareDetail",
+        mixins: [form],
+        components: {
+
+        },
+        created() {
+            this.changePath("staff/care")
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鍛樺伐鍏虫€€淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                direction:"rtl",
+                toString:[
+                    "careType",
+                    "sendStatus",
+                ],
+                toDate:[
+                    "birthday",
+                    "entryDate",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    staffName: [
+                        {required: true,message: "璇疯緭鍏ュ憳宸ュ鍚�", trigger: "blur" },
+                        {max: 64,message: "鏈€澶氬彧鑳藉綍鍏�64涓瓧绗�",trigger: "blur",},
+                    ],
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/care/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鍛樺伐鍏虫€€淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "staff/care/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鍛樺伐鍏虫€€淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/care/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鍛樺伐鍏虫€€淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    staffId : null,
+                    staffName : "",
+                    birthday : null,
+                    deptId : null,
+                    deptName : "",
+                    jobId : null,
+                    jobName : "",
+                    entryDate : null,
+                    careType : 1,
+                    sendStatus : 0,
+                    content : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/care/list.vue b/attendance-performance-manager-ui/admin/src/views/staff/care/list.vue
new file mode 100644
index 0000000000000000000000000000000000000000..b7b549ee0c78d5b7ba32f8e680dd9f4307bb9ea8
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/care/list.vue
@@ -0,0 +1,76 @@
+<template>
+    <div class="page">
+        <LayoutTable :data="tableData" :config="tableConfig">
+                    </LayoutTable>
+
+
+        <drawer-show ref="drawerform" @ok="getData" />
+    </div>
+</template>
+
+<script>
+    /** 琛ㄥ崟寮瑰嚭妗嗘ā寮忛渶寮曞叆 */
+    import drawerShow from "./drawershow";
+    import table from "@/assets/mixins/table";
+    export default {
+        name: "StaffCareList",
+        components: {
+            drawerShow
+},
+        mixins: [table],
+        created() {
+        },
+        methods: {
+            /** 閲嶅啓鏂板鏂规硶 */
+            toAdd(row) {
+                this.$refs.drawerform.add(row);
+            },
+            /** 閲嶅啓缂栬緫鏂规硶 */
+            toEdit(row) {
+                this.$refs.drawerform.edit(row);
+            },
+            /** 閲嶅啓鏌ョ湅鏂规硶 */
+            toView(row) {
+                this.$refs.drawerform.view(row);
+            },
+
+        },
+        data() {
+            return {
+                config: {
+                    search: [
+                        {
+                            name: "staffName",
+                            type: "text",
+                            label: "鍛樺伐濮撳悕",
+                            fuzzy: true
+                        },
+                    ],
+                    columns: [
+                        {type: "selection", width: 60},
+                        {type: "index",label: "搴忓彿",width: 50},
+
+                        {label: "鍛樺伐濮撳悕", prop: "staffName"},
+
+                        {label: "鍏ヨ亴鏃堕棿", prop: "entryDate", formatter: this.formatterDate},
+
+                        {label: "鍏虫€€绫诲瀷", prop: "careType",formatter: this.formatter},
+
+                        {label: "鍙戦€佺姸鎬�", prop: "sendStatus",formatter: this.formatter},
+
+                        {label: "鍒涘缓鐢ㄦ埛", prop: "createUserId", formatter: this.formatter},
+                        {
+                            label: "鎿嶄綔",
+                            width: 240,
+                            formatter: row => {
+                                return (
+                                    <table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
+                            );
+                            }
+                        }
+                    ]
+                }
+            };
+        }
+    };
+</script>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/care/view.vue b/attendance-performance-manager-ui/admin/src/views/staff/care/view.vue
new file mode 100644
index 0000000000000000000000000000000000000000..bb26d5b0c03df5c3aa322196a33458ec00910412
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/care/view.vue
@@ -0,0 +1,88 @@
+<template>
+    <layout-view>
+        <el-descriptions  :title="title" :column="column" :size="size" :colon="false" border>
+            <template slot="title">
+                <i class="el-icon-tickets"></i>
+                鍩烘湰璇︾粏淇℃伅
+            </template>
+            <template slot="extra">
+                <el-button type="primary" @click="$router.go(-1)" size="small">杩斿洖</el-button>
+            </template>
+                                    <el-descriptions-item label="鍛樺伐濮撳悕" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.staffName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍑虹敓鏃ユ湡" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.birthday)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎵€灞為儴闂�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.deptId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎵€灞為儴闂ㄥ悕绉�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.deptName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱屼綅ID" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.jobId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱屼綅鍚嶇О" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.jobName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍏ヨ亴鏃堕棿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.entryDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍏虫€€绫诲瀷" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("careType", form.careType) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍙戦€佺姸鎬�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("sendStatus", form.sendStatus) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍏虫€€鍐呭" label-class-name="labelClass" content-class-name="contentClass">
+                            <editor v-model="form.content" :min-height="256"/>
+                        </el-descriptions-item>
+        </el-descriptions>
+
+    </layout-view>
+</template>
+
+<script>
+    import view from "@/assets/mixins/view";
+    import Editor from '@/components/Editor';
+    export default {
+        mixins: [view],
+        components: {
+            Editor,
+        },
+        methods: {
+
+        },
+        data() {
+            return {
+                size:"small",
+                column:2,
+                toString:[
+                    "careType",
+                    "sendStatus",
+                ],
+                toArrays: [
+
+                ],
+                toDate: [
+
+                ]
+            }
+        }
+    }
+</script>
+<style lang="less">
+    .labelClass{
+        width: 200px;
+    }
+    .el-descriptions__body{
+        margin-left: 5px;
+        margin-right: 5px;
+        color: #606266;
+        background-color: #FFF;
+    }
+    .contentClass{
+        width: 600px;
+    }
+</style>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/contract/dialogshow.vue b/attendance-performance-manager-ui/admin/src/views/staff/contract/dialogshow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..88c8b8e0c0191f459b15ded9f7bd0ab4649963d1
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/contract/dialogshow.vue
@@ -0,0 +1,154 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-dialog :title="title" :visible.sync="open" width="90%" append-to-body>
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍛樺伐ID" prop="staffId" v-model="form.staffId" placeholder="璇疯緭鍏ュ憳宸D"/>
+                            <Field label="鍛樺伐濮撳悕" prop="staffName" v-model="form.staffName" placeholder="璇疯緭鍏ュ憳宸ュ鍚�"/>
+                            <Field label="鎬у埆" prop="gender" v-model="form.gender" type="select" :enumData="dict.gender" placeholder="璇烽€夋嫨鎬у埆"/>
+                            <Field label="鍑虹敓鏃ユ湡" prop="birthday" v-model="form.birthday" type="date" />
+                            <Field label="鐓х墖" prop="photoPath" v-model="form.photoPath" type="textarea" placeholder="璇疯緭鍏ョ収鐗�"/>
+                            <Field label="鑱旂郴鐢佃瘽" prop="phoneNumber" v-model="form.phoneNumber" placeholder="璇疯緭鍏ヨ仈绯荤數璇�"/>
+                            <Field label="韬唤璇佸彿鐮�" prop="idCard" v-model="form.idCard" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙风爜"/>
+                            <Field label="宸ュ彿" prop="workNum" v-model="form.workNum" placeholder="璇疯緭鍏ュ伐鍙�"/>
+                            <Field label="鏀挎不闈㈣矊 " prop="politicalstatus" v-model="form.politicalstatus" type="select" :enumData="dict.politicalstatus" placeholder="璇烽€夋嫨鏀挎不闈㈣矊 "/>
+                            <Field label="鎵€灞為儴闂�" prop="deptId" v-model="form.deptId" placeholder="璇疯緭鍏ユ墍灞為儴闂�"/>
+                            <Field label="鎵€灞為儴闂ㄥ悕绉�" prop="deptName" v-model="form.deptName" placeholder="璇疯緭鍏ユ墍灞為儴闂ㄥ悕绉�"/>
+                            <Field label="鑱屼綅ID" prop="jobId" v-model="form.jobId" placeholder="璇疯緭鍏ヨ亴浣岻D"/>
+                            <Field label="鑱屼綅鍚嶇О" prop="jobName" v-model="form.jobName" placeholder="璇疯緭鍏ヨ亴浣嶅悕绉�"/>
+                            <Field label="鍛樺伐绫诲瀷" prop="staffType" v-model="form.staffType" type="select" :enumData="dict.staffType" placeholder="璇烽€夋嫨鍛樺伐绫诲瀷"/>
+                            <Field label="鍛樺伐鐘舵€�" prop="status" v-model="form.status" type="select" :enumData="dict.status" placeholder="璇烽€夋嫨鍛樺伐鐘舵€�"/>
+                            <Field label="鍏ヨ亴鏃堕棿" prop="entryDate" v-model="form.entryDate" type="date" />
+                            <Field label="鐜板悎鍚屽紑濮嬫椂闂�" prop="contractStartDate" v-model="form.contractStartDate" type="date" />
+                            <Field label="鐜板悎鍚屽埌鏈熸椂闂�" prop="contractEndDate" v-model="form.contractEndDate" type="date" />
+                            <Field label="鍚堝悓鍏徃" prop="contractCompany" v-model="form.contractCompany" type="textarea" placeholder="璇疯緭鍏ュ悎鍚屽叕鍙�"/>
+                            <Field label="鍚堝悓绫诲瀷" prop="contractType" v-model="form.contractType" type="select" :enumData="dict.contractType" placeholder="璇烽€夋嫨鍚堝悓绫诲瀷"/>
+                            <Field label="鏂板悎鍚屽紑濮嬫椂闂�" prop="newStartDate" v-model="form.newStartDate" type="date" />
+                            <Field label="鏂板悎鍚屽埌鏈熸椂闂�" prop="newEndDate" v-model="form.newEndDate" type="date" />
+                            <Field label="瀹℃牳鐘舵€�" prop="auditStatus" v-model="form.auditStatus" type="select" :enumData="dict.auditStatus" placeholder="璇烽€夋嫨瀹℃牳鐘舵€�"/>
+
+            </el-row>
+
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button type="primary" v-if="pageInfo.type !== 'view'" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    import dialogShow from "./dialogshow";
+    export default {
+        mixins: [form],
+        components: {
+            dialogShow ,
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鍛樺伐鍚堝悓淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                toString:[
+                    "gender",
+                    "politicalstatus",
+                    "staffType",
+                    "status",
+                    "contractType",
+                    "auditStatus",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    staffName: [
+                        {required: true,message: "璇疯緭鍏ュ憳宸ュ鍚�", trigger: "blur" },
+                        {max: 64,message: "鏈€澶氬彧鑳藉綍鍏�64涓瓧绗�",trigger: "blur",},
+                    ],
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/contract/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鍛樺伐鍚堝悓淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "staff/contract/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鍛樺伐鍚堝悓淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/contract/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鍛樺伐鍚堝悓淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    staffId : null,
+                    staffName : "",
+                    gender : 1,
+                    birthday : null,
+                    photoPath : "",
+                    phoneNumber : "",
+                    idCard : "",
+                    workNum : "",
+                    politicalstatus : 1,
+                    deptId : null,
+                    deptName : "",
+                    jobId : null,
+                    jobName : "",
+                    staffType : 1,
+                    status : 1,
+                    entryDate : null,
+                    contractStartDate : null,
+                    contractEndDate : null,
+                    contractCompany : "",
+                    contractType : 1,
+                    newStartDate : null,
+                    newEndDate : null,
+                    auditStatus : 0,
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/contract/drawershow.vue b/attendance-performance-manager-ui/admin/src/views/staff/contract/drawershow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..6e1051075f1b4fae9d246a3867212fc0afcf460d
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/contract/drawershow.vue
@@ -0,0 +1,168 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-drawer
+            :title="title"
+            :visible.sync="open"
+            :direction="direction"
+            size="50%">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍛樺伐ID" prop="staffId" v-model="form.staffId" placeholder="璇疯緭鍏ュ憳宸D"/>
+                            <Field label="鍛樺伐濮撳悕" prop="staffName" v-model="form.staffName" placeholder="璇疯緭鍏ュ憳宸ュ鍚�"/>
+                            <Field label="鎬у埆" prop="gender" v-model="form.gender" type="select" :enumData="dict.gender" placeholder="璇烽€夋嫨鎬у埆"/>
+                            <Field label="鍑虹敓鏃ユ湡" prop="birthday" v-model="form.birthday" type="date" />
+                            <Field label="鐓х墖" prop="photoPath" v-model="form.photoPath" type="textarea" placeholder="璇疯緭鍏ョ収鐗�"/>
+                            <Field label="鑱旂郴鐢佃瘽" prop="phoneNumber" v-model="form.phoneNumber" placeholder="璇疯緭鍏ヨ仈绯荤數璇�"/>
+                            <Field label="韬唤璇佸彿鐮�" prop="idCard" v-model="form.idCard" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙风爜"/>
+                            <Field label="宸ュ彿" prop="workNum" v-model="form.workNum" placeholder="璇疯緭鍏ュ伐鍙�"/>
+                            <Field label="鏀挎不闈㈣矊 " prop="politicalstatus" v-model="form.politicalstatus" type="select" :enumData="dict.politicalstatus" placeholder="璇烽€夋嫨鏀挎不闈㈣矊 "/>
+                            <Field label="鎵€灞為儴闂�" prop="deptId" v-model="form.deptId" placeholder="璇疯緭鍏ユ墍灞為儴闂�"/>
+                            <Field label="鎵€灞為儴闂ㄥ悕绉�" prop="deptName" v-model="form.deptName" placeholder="璇疯緭鍏ユ墍灞為儴闂ㄥ悕绉�"/>
+                            <Field label="鑱屼綅ID" prop="jobId" v-model="form.jobId" placeholder="璇疯緭鍏ヨ亴浣岻D"/>
+                            <Field label="鑱屼綅鍚嶇О" prop="jobName" v-model="form.jobName" placeholder="璇疯緭鍏ヨ亴浣嶅悕绉�"/>
+                            <Field label="鍛樺伐绫诲瀷" prop="staffType" v-model="form.staffType" type="select" :enumData="dict.staffType" placeholder="璇烽€夋嫨鍛樺伐绫诲瀷"/>
+                            <Field label="鍛樺伐鐘舵€�" prop="status" v-model="form.status" type="select" :enumData="dict.status" placeholder="璇烽€夋嫨鍛樺伐鐘舵€�"/>
+                            <Field label="鍏ヨ亴鏃堕棿" prop="entryDate" v-model="form.entryDate" type="date" />
+                            <Field label="鐜板悎鍚屽紑濮嬫椂闂�" prop="contractStartDate" v-model="form.contractStartDate" type="date" />
+                            <Field label="鐜板悎鍚屽埌鏈熸椂闂�" prop="contractEndDate" v-model="form.contractEndDate" type="date" />
+                            <Field label="鍚堝悓鍏徃" prop="contractCompany" v-model="form.contractCompany" type="textarea" placeholder="璇疯緭鍏ュ悎鍚屽叕鍙�"/>
+                            <Field label="鍚堝悓绫诲瀷" prop="contractType" v-model="form.contractType" type="select" :enumData="dict.contractType" placeholder="璇烽€夋嫨鍚堝悓绫诲瀷"/>
+                            <Field label="鏂板悎鍚屽紑濮嬫椂闂�" prop="newStartDate" v-model="form.newStartDate" type="date" />
+                            <Field label="鏂板悎鍚屽埌鏈熸椂闂�" prop="newEndDate" v-model="form.newEndDate" type="date" />
+                            <Field label="瀹℃牳鐘舵€�" prop="auditStatus" v-model="form.auditStatus" type="select" :enumData="dict.auditStatus" placeholder="璇烽€夋嫨瀹℃牳鐘舵€�"/>
+
+            </el-row>
+
+            <form-buttons @submit='submitForm' noCancelBtn />
+        </el-form>
+
+    </el-drawer>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    export default {
+        name: "StaffContractDetail",
+        mixins: [form],
+        components: {
+
+        },
+        created() {
+            this.changePath("staff/contract")
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鍛樺伐鍚堝悓淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                direction:"rtl",
+                toString:[
+                    "gender",
+                    "politicalstatus",
+                    "staffType",
+                    "status",
+                    "contractType",
+                    "auditStatus",
+                ],
+                toDate:[
+                    "birthday",
+                    "entryDate",
+                    "contractStartDate",
+                    "contractEndDate",
+                    "newStartDate",
+                    "newEndDate",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    staffName: [
+                        {required: true,message: "璇疯緭鍏ュ憳宸ュ鍚�", trigger: "blur" },
+                        {max: 64,message: "鏈€澶氬彧鑳藉綍鍏�64涓瓧绗�",trigger: "blur",},
+                    ],
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/contract/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鍛樺伐鍚堝悓淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "staff/contract/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鍛樺伐鍚堝悓淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/contract/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鍛樺伐鍚堝悓淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    staffId : null,
+                    staffName : "",
+                    gender : 1,
+                    birthday : null,
+                    photoPath : "",
+                    phoneNumber : "",
+                    idCard : "",
+                    workNum : "",
+                    politicalstatus : 1,
+                    deptId : null,
+                    deptName : "",
+                    jobId : null,
+                    jobName : "",
+                    staffType : 1,
+                    status : 1,
+                    entryDate : null,
+                    contractStartDate : null,
+                    contractEndDate : null,
+                    contractCompany : "",
+                    contractType : 1,
+                    newStartDate : null,
+                    newEndDate : null,
+                    auditStatus : 0,
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/contract/list.vue b/attendance-performance-manager-ui/admin/src/views/staff/contract/list.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f17acd304183af59d626e87f74873790997e2ad3
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/contract/list.vue
@@ -0,0 +1,116 @@
+<template>
+    <div class="page">
+        <LayoutTable :data="tableData" :config="tableConfig">
+                    </LayoutTable>
+
+
+        <drawer-show ref="drawerform" @ok="getData" />
+    </div>
+</template>
+
+<script>
+    /** 琛ㄥ崟寮瑰嚭妗嗘ā寮忛渶寮曞叆 */
+    import drawerShow from "./drawershow";
+    import table from "@/assets/mixins/table";
+    export default {
+        name: "StaffContractList",
+        components: {
+            drawerShow
+},
+        mixins: [table],
+        created() {
+        },
+        methods: {
+            /** 閲嶅啓鏂板鏂规硶 */
+            toAdd(row) {
+                this.$refs.drawerform.add(row);
+            },
+            /** 閲嶅啓缂栬緫鏂规硶 */
+            toEdit(row) {
+                this.$refs.drawerform.edit(row);
+            },
+            /** 閲嶅啓鏌ョ湅鏂规硶 */
+            toView(row) {
+                this.$refs.drawerform.view(row);
+            },
+
+        },
+        data() {
+            return {
+                config: {
+                    search: [
+                        {
+                            name: "staffName",
+                            type: "text",
+                            label: "鍛樺伐濮撳悕",
+                            fuzzy: true
+                        },
+                        {
+                            name: "politicalstatus",
+                            type: "select",
+                            label: "鏀挎不闈㈣矊 ",
+                            fuzzy: true
+                        },
+                        {
+                            name: "staffType",
+                            type: "select",
+                            label: "鍛樺伐绫诲瀷",
+                            fuzzy: true
+                        },
+                        {
+                            name: "status",
+                            type: "select",
+                            label: "鍛樺伐鐘舵€�",
+                            fuzzy: true
+                        },
+                        {
+                            name: "auditStatus",
+                            type: "select",
+                            label: "瀹℃牳鐘舵€�",
+                            fuzzy: true
+                        },
+                    ],
+                    columns: [
+                        {type: "selection", width: 60},
+                        {type: "index",label: "搴忓彿",width: 50},
+
+                        {label: "鍛樺伐濮撳悕", prop: "staffName"},
+
+                        {label: "鎬у埆", prop: "gender",formatter: this.formatter},
+
+                        {label: "鏀挎不闈㈣矊 ", prop: "politicalstatus",formatter: this.formatter},
+
+                        {label: "鍛樺伐绫诲瀷", prop: "staffType",formatter: this.formatter},
+
+                        {label: "鍛樺伐鐘舵€�", prop: "status",formatter: this.formatter},
+
+                        {label: "鍏ヨ亴鏃堕棿", prop: "entryDate", formatter: this.formatterDate},
+
+                        {label: "鐜板悎鍚屽紑濮嬫椂闂�", prop: "contractStartDate", formatter: this.formatterDate},
+
+                        {label: "鐜板悎鍚屽埌鏈熸椂闂�", prop: "contractEndDate", formatter: this.formatterDate},
+
+                        {label: "鍚堝悓绫诲瀷", prop: "contractType",formatter: this.formatter},
+
+                        {label: "鏂板悎鍚屽紑濮嬫椂闂�", prop: "newStartDate", formatter: this.formatterDate},
+
+                        {label: "鏂板悎鍚屽埌鏈熸椂闂�", prop: "newEndDate", formatter: this.formatterDate},
+
+                        {label: "瀹℃牳鐘舵€�", prop: "auditStatus",formatter: this.formatter},
+
+                        {label: "鍒涘缓鐢ㄦ埛", prop: "createUserId", formatter: this.formatter},
+                        {
+                            label: "鎿嶄綔",
+                            width: 240,
+                            formatter: row => {
+                                return (
+                                    <table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
+                            );
+                            }
+                        }
+                    ]
+                }
+            };
+        }
+    };
+</script>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/contract/view.vue b/attendance-performance-manager-ui/admin/src/views/staff/contract/view.vue
new file mode 100644
index 0000000000000000000000000000000000000000..3d231b53a1af6ac914c877bb7b0c2e5967cede66
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/contract/view.vue
@@ -0,0 +1,129 @@
+<template>
+    <layout-view>
+        <el-descriptions  :title="title" :column="column" :size="size" :colon="false" border>
+            <template slot="title">
+                <i class="el-icon-tickets"></i>
+                鍩烘湰璇︾粏淇℃伅
+            </template>
+            <template slot="extra">
+                <el-button type="primary" @click="$router.go(-1)" size="small">杩斿洖</el-button>
+            </template>
+                                    <el-descriptions-item label="鍛樺伐ID" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.staffId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍛樺伐濮撳悕" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.staffName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎬у埆" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("gender", form.gender) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍑虹敓鏃ユ湡" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.birthday)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鐓х墖" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.photoPath}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱旂郴鐢佃瘽" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.phoneNumber}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="韬唤璇佸彿鐮�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.idCard}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="宸ュ彿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.workNum}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鏀挎不闈㈣矊 " label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("politicalstatus", form.politicalstatus) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎵€灞為儴闂�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.deptId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎵€灞為儴闂ㄥ悕绉�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.deptName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱屼綅ID" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.jobId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱屼綅鍚嶇О" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.jobName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍛樺伐绫诲瀷" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("staffType", form.staffType) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍛樺伐鐘舵€�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("status", form.status) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍏ヨ亴鏃堕棿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.entryDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鐜板悎鍚屽紑濮嬫椂闂�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.contractStartDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鐜板悎鍚屽埌鏈熸椂闂�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.contractEndDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍚堝悓鍏徃" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.contractCompany}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍚堝悓绫诲瀷" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("contractType", form.contractType) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鏂板悎鍚屽紑濮嬫椂闂�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.newStartDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鏂板悎鍚屽埌鏈熸椂闂�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.newEndDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="瀹℃牳鐘舵€�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("auditStatus", form.auditStatus) }}
+                        </el-descriptions-item>
+        </el-descriptions>
+
+    </layout-view>
+</template>
+
+<script>
+    import view from "@/assets/mixins/view";
+    export default {
+        mixins: [view],
+        components: {
+        },
+        methods: {
+
+        },
+        data() {
+            return {
+                size:"small",
+                column:2,
+                toString:[
+                    "gender",
+                    "politicalstatus",
+                    "staffType",
+                    "status",
+                    "contractType",
+                    "auditStatus",
+                ],
+                toArrays: [
+
+                ],
+                toDate: [
+
+                ]
+            }
+        }
+    }
+</script>
+<style lang="less">
+    .labelClass{
+        width: 200px;
+    }
+    .el-descriptions__body{
+        margin-left: 5px;
+        margin-right: 5px;
+        color: #606266;
+        background-color: #FFF;
+    }
+    .contentClass{
+        width: 600px;
+    }
+</style>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/dialogshow.vue b/attendance-performance-manager-ui/admin/src/views/staff/dialogshow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..38f499497bd2b7525971b7a39ae936ad063b0bb2
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/dialogshow.vue
@@ -0,0 +1,144 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-dialog :title="title" :visible.sync="open" width="90%" append-to-body>
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍛樺伐濮撳悕" prop="name" v-model="form.name" placeholder="璇疯緭鍏ュ憳宸ュ鍚�"/>
+                            <Field label="鎬у埆" prop="gender" v-model="form.gender" type="select" :enumData="dict.gender" placeholder="璇烽€夋嫨鎬у埆"/>
+                            <Field label="鍑虹敓鏃ユ湡" prop="birthday" v-model="form.birthday" type="date" />
+                            <Field label="鐓х墖" prop="photoPath" v-model="form.photoPath" type="textarea" placeholder="璇疯緭鍏ョ収鐗�"/>
+                            <Field label="鑱旂郴鐢佃瘽" prop="phoneNumber" v-model="form.phoneNumber" placeholder="璇疯緭鍏ヨ仈绯荤數璇�"/>
+                            <Field label="韬唤璇佸彿鐮�" prop="idCard" v-model="form.idCard" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙风爜"/>
+                            <Field label="宸ュ彿" prop="workNum" v-model="form.workNum" placeholder="璇疯緭鍏ュ伐鍙�"/>
+                            <Field label="鏀挎不闈㈣矊 " prop="politicalstatus" v-model="form.politicalstatus" type="select" :enumData="dict.politicalstatus" placeholder="璇烽€夋嫨鏀挎不闈㈣矊 "/>
+                            <Field label="鎵€灞為儴闂�" prop="deptId" v-model="form.deptId" placeholder="璇疯緭鍏ユ墍灞為儴闂�"/>
+                            <Field label="鎵€灞為儴闂ㄥ悕绉�" prop="deptName" v-model="form.deptName" placeholder="璇疯緭鍏ユ墍灞為儴闂ㄥ悕绉�"/>
+                            <Field label="鑱屼綅ID" prop="positionId" v-model="form.positionId" placeholder="璇疯緭鍏ヨ亴浣岻D"/>
+                            <Field label="鑱屼綅鍚嶇О" prop="positionName" v-model="form.positionName" placeholder="璇疯緭鍏ヨ亴浣嶅悕绉�"/>
+                            <Field label="鍛樺伐绫诲瀷" prop="staffType" v-model="form.staffType" type="select" :enumData="dict.staffType" placeholder="璇烽€夋嫨鍛樺伐绫诲瀷"/>
+                            <Field label="鍛樺伐鐘舵€�" prop="status" v-model="form.status" type="select" :enumData="dict.status" placeholder="璇烽€夋嫨鍛樺伐鐘舵€�"/>
+                            <Field label="鍏ヨ亴鐧昏琛�" prop="registerPath" v-model="form.registerPath" type="textarea" placeholder="璇疯緭鍏ュ叆鑱岀櫥璁拌〃"/>
+                            <Field label="鍏ヨ亴鏃堕棿" prop="entryDate" v-model="form.entryDate" type="date" />
+                            <Field label="杞鏃堕棿" prop="regularDate" v-model="form.regularDate" type="date" />
+                            <Field label="绂昏亴鏃堕棿" prop="leaveDate" v-model="form.leaveDate" type="date" />
+                            <Field label="澶囨敞" prop="remark" v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+
+            </el-row>
+
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button type="primary" v-if="pageInfo.type !== 'view'" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    import dialogShow from "./dialogshow";
+    export default {
+        mixins: [form],
+        components: {
+            dialogShow ,
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鍛樺伐鍩烘湰淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                toString:[
+                    "gender",
+                    "politicalstatus",
+                    "staffType",
+                    "status",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    name: [
+                        {required: true,message: "璇疯緭鍏ュ憳宸ュ鍚�", trigger: "blur" },
+                        {max: 64,message: "鏈€澶氬彧鑳藉綍鍏�64涓瓧绗�",trigger: "blur",},
+                    ],
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鍛樺伐鍩烘湰淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "staff/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鍛樺伐鍩烘湰淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鍛樺伐鍩烘湰淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    name : "",
+                    gender : 1,
+                    birthday : null,
+                    photoPath : "",
+                    phoneNumber : "",
+                    idCard : "",
+                    workNum : "",
+                    politicalstatus : 1,
+                    deptId : null,
+                    deptName : "",
+                    positionId : null,
+                    positionName : "",
+                    staffType : 1,
+                    status : 1,
+                    registerPath : "",
+                    entryDate : null,
+                    regularDate : null,
+                    leaveDate : null,
+                    remark : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/drawershow.vue b/attendance-performance-manager-ui/admin/src/views/staff/drawershow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..0239b0084d79443768d1c304ef5b06ef6fc6aa72
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/drawershow.vue
@@ -0,0 +1,156 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-drawer
+            :title="title"
+            :visible.sync="open"
+            :direction="direction"
+            size="50%">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍛樺伐濮撳悕" prop="name" v-model="form.name" placeholder="璇疯緭鍏ュ憳宸ュ鍚�"/>
+                            <Field label="鎬у埆" prop="gender" v-model="form.gender" type="select" :enumData="dict.gender" placeholder="璇烽€夋嫨鎬у埆"/>
+                            <Field label="鍑虹敓鏃ユ湡" prop="birthday" v-model="form.birthday" type="date" />
+                            <Field label="鐓х墖" prop="photoPath" v-model="form.photoPath" type="textarea" placeholder="璇疯緭鍏ョ収鐗�"/>
+                            <Field label="鑱旂郴鐢佃瘽" prop="phoneNumber" v-model="form.phoneNumber" placeholder="璇疯緭鍏ヨ仈绯荤數璇�"/>
+                            <Field label="韬唤璇佸彿鐮�" prop="idCard" v-model="form.idCard" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙风爜"/>
+                            <Field label="宸ュ彿" prop="workNum" v-model="form.workNum" placeholder="璇疯緭鍏ュ伐鍙�"/>
+                            <Field label="鏀挎不闈㈣矊 " prop="politicalstatus" v-model="form.politicalstatus" type="select" :enumData="dict.politicalstatus" placeholder="璇烽€夋嫨鏀挎不闈㈣矊 "/>
+                            <Field label="鎵€灞為儴闂�" prop="deptId" v-model="form.deptId" placeholder="璇疯緭鍏ユ墍灞為儴闂�"/>
+                            <Field label="鎵€灞為儴闂ㄥ悕绉�" prop="deptName" v-model="form.deptName" placeholder="璇疯緭鍏ユ墍灞為儴闂ㄥ悕绉�"/>
+                            <Field label="鑱屼綅ID" prop="positionId" v-model="form.positionId" placeholder="璇疯緭鍏ヨ亴浣岻D"/>
+                            <Field label="鑱屼綅鍚嶇О" prop="positionName" v-model="form.positionName" placeholder="璇疯緭鍏ヨ亴浣嶅悕绉�"/>
+                            <Field label="鍛樺伐绫诲瀷" prop="staffType" v-model="form.staffType" type="select" :enumData="dict.staffType" placeholder="璇烽€夋嫨鍛樺伐绫诲瀷"/>
+                            <Field label="鍛樺伐鐘舵€�" prop="status" v-model="form.status" type="select" :enumData="dict.status" placeholder="璇烽€夋嫨鍛樺伐鐘舵€�"/>
+                            <Field label="鍏ヨ亴鐧昏琛�" prop="registerPath" v-model="form.registerPath" type="textarea" placeholder="璇疯緭鍏ュ叆鑱岀櫥璁拌〃"/>
+                            <Field label="鍏ヨ亴鏃堕棿" prop="entryDate" v-model="form.entryDate" type="date" />
+                            <Field label="杞鏃堕棿" prop="regularDate" v-model="form.regularDate" type="date" />
+                            <Field label="绂昏亴鏃堕棿" prop="leaveDate" v-model="form.leaveDate" type="date" />
+                            <Field label="澶囨敞" prop="remark" v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+
+            </el-row>
+
+            <form-buttons @submit='submitForm' noCancelBtn />
+        </el-form>
+
+    </el-drawer>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    export default {
+        name: "StaffDetail",
+        mixins: [form],
+        components: {
+
+        },
+        created() {
+            this.changePath("staff")
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鍛樺伐鍩烘湰淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                direction:"rtl",
+                toString:[
+                    "gender",
+                    "politicalstatus",
+                    "staffType",
+                    "status",
+                ],
+                toDate:[
+                    "birthday",
+                    "entryDate",
+                    "regularDate",
+                    "leaveDate",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    name: [
+                        {required: true,message: "璇疯緭鍏ュ憳宸ュ鍚�", trigger: "blur" },
+                        {max: 64,message: "鏈€澶氬彧鑳藉綍鍏�64涓瓧绗�",trigger: "blur",},
+                    ],
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鍛樺伐鍩烘湰淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "staff/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鍛樺伐鍩烘湰淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鍛樺伐鍩烘湰淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    name : "",
+                    gender : 1,
+                    birthday : null,
+                    photoPath : "",
+                    phoneNumber : "",
+                    idCard : "",
+                    workNum : "",
+                    politicalstatus : 1,
+                    deptId : null,
+                    deptName : "",
+                    positionId : null,
+                    positionName : "",
+                    staffType : 1,
+                    status : 1,
+                    registerPath : "",
+                    entryDate : null,
+                    regularDate : null,
+                    leaveDate : null,
+                    remark : "",
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/leave/dialogshow.vue b/attendance-performance-manager-ui/admin/src/views/staff/leave/dialogshow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..0c03935e3fc11b517334b4e26ddbe96c0345e841
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/leave/dialogshow.vue
@@ -0,0 +1,145 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-dialog :title="title" :visible.sync="open" width="90%" append-to-body>
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍛樺伐ID" prop="staffId" v-model="form.staffId" placeholder="璇疯緭鍏ュ憳宸D"/>
+                            <Field label="鍛樺伐濮撳悕" prop="staffName" v-model="form.staffName" placeholder="璇疯緭鍏ュ憳宸ュ鍚�"/>
+                            <Field label="鎬у埆" prop="gender" v-model="form.gender" type="select" :enumData="dict.gender" placeholder="璇烽€夋嫨鎬у埆"/>
+                            <Field label="鍑虹敓鏃ユ湡" prop="birthday" v-model="form.birthday" type="date" />
+                            <Field label="鐓х墖" prop="photoPath" v-model="form.photoPath" type="textarea" placeholder="璇疯緭鍏ョ収鐗�"/>
+                            <Field label="鑱旂郴鐢佃瘽" prop="phoneNumber" v-model="form.phoneNumber" placeholder="璇疯緭鍏ヨ仈绯荤數璇�"/>
+                            <Field label="韬唤璇佸彿鐮�" prop="idCard" v-model="form.idCard" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙风爜"/>
+                            <Field label="宸ュ彿" prop="workNum" v-model="form.workNum" placeholder="璇疯緭鍏ュ伐鍙�"/>
+                            <Field label="鏀挎不闈㈣矊 " prop="politicalstatus" v-model="form.politicalstatus" type="select" :enumData="dict.politicalstatus" placeholder="璇烽€夋嫨鏀挎不闈㈣矊 "/>
+                            <Field label="鎵€灞為儴闂�" prop="deptId" v-model="form.deptId" placeholder="璇疯緭鍏ユ墍灞為儴闂�"/>
+                            <Field label="鎵€灞為儴闂ㄥ悕绉�" prop="deptName" v-model="form.deptName" placeholder="璇疯緭鍏ユ墍灞為儴闂ㄥ悕绉�"/>
+                            <Field label="鑱屼綅ID" prop="jobId" v-model="form.jobId" placeholder="璇疯緭鍏ヨ亴浣岻D"/>
+                            <Field label="鑱屼綅鍚嶇О" prop="jobName" v-model="form.jobName" placeholder="璇疯緭鍏ヨ亴浣嶅悕绉�"/>
+                            <Field label="鍛樺伐绫诲瀷" prop="staffType" v-model="form.staffType" type="select" :enumData="dict.staffType" placeholder="璇烽€夋嫨鍛樺伐绫诲瀷"/>
+                            <Field label="鍛樺伐鐘舵€�" prop="status" v-model="form.status" type="select" :enumData="dict.status" placeholder="璇烽€夋嫨鍛樺伐鐘舵€�"/>
+                            <Field label="鍏ヨ亴鏃堕棿" prop="entryDate" v-model="form.entryDate" type="date" />
+                            <Field label="绂昏亴鏃堕棿" prop="leaveDate" v-model="form.leaveDate" type="date" />
+                            <Field label="绂昏亴鍘熷洜" prop="leaveReason" v-model="form.leaveReason" type="textarea" placeholder="璇疯緭鍏ョ鑱屽師鍥�"/>
+                            <Field label="瀹℃牳鐘舵€�" prop="auditStatus" v-model="form.auditStatus" type="select" :enumData="dict.auditStatus" placeholder="璇烽€夋嫨瀹℃牳鐘舵€�"/>
+
+            </el-row>
+
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button type="primary" v-if="pageInfo.type !== 'view'" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    import dialogShow from "./dialogshow";
+    export default {
+        mixins: [form],
+        components: {
+            dialogShow ,
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鍛樺伐绂昏亴淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                toString:[
+                    "gender",
+                    "politicalstatus",
+                    "staffType",
+                    "status",
+                    "auditStatus",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    staffName: [
+                        {required: true,message: "璇疯緭鍏ュ憳宸ュ鍚�", trigger: "blur" },
+                        {max: 64,message: "鏈€澶氬彧鑳藉綍鍏�64涓瓧绗�",trigger: "blur",},
+                    ],
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/leave/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鍛樺伐绂昏亴淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "staff/leave/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鍛樺伐绂昏亴淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/leave/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鍛樺伐绂昏亴淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    staffId : null,
+                    staffName : "",
+                    gender : 1,
+                    birthday : null,
+                    photoPath : "",
+                    phoneNumber : "",
+                    idCard : "",
+                    workNum : "",
+                    politicalstatus : 1,
+                    deptId : null,
+                    deptName : "",
+                    jobId : null,
+                    jobName : "",
+                    staffType : 1,
+                    status : 1,
+                    entryDate : null,
+                    leaveDate : null,
+                    leaveReason : "",
+                    auditStatus : 0,
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/leave/drawershow.vue b/attendance-performance-manager-ui/admin/src/views/staff/leave/drawershow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..82dac383ca74a8a64f969a1a8377808ef2d60e52
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/leave/drawershow.vue
@@ -0,0 +1,156 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-drawer
+            :title="title"
+            :visible.sync="open"
+            :direction="direction"
+            size="50%">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍛樺伐ID" prop="staffId" v-model="form.staffId" placeholder="璇疯緭鍏ュ憳宸D"/>
+                            <Field label="鍛樺伐濮撳悕" prop="staffName" v-model="form.staffName" placeholder="璇疯緭鍏ュ憳宸ュ鍚�"/>
+                            <Field label="鎬у埆" prop="gender" v-model="form.gender" type="select" :enumData="dict.gender" placeholder="璇烽€夋嫨鎬у埆"/>
+                            <Field label="鍑虹敓鏃ユ湡" prop="birthday" v-model="form.birthday" type="date" />
+                            <Field label="鐓х墖" prop="photoPath" v-model="form.photoPath" type="textarea" placeholder="璇疯緭鍏ョ収鐗�"/>
+                            <Field label="鑱旂郴鐢佃瘽" prop="phoneNumber" v-model="form.phoneNumber" placeholder="璇疯緭鍏ヨ仈绯荤數璇�"/>
+                            <Field label="韬唤璇佸彿鐮�" prop="idCard" v-model="form.idCard" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙风爜"/>
+                            <Field label="宸ュ彿" prop="workNum" v-model="form.workNum" placeholder="璇疯緭鍏ュ伐鍙�"/>
+                            <Field label="鏀挎不闈㈣矊 " prop="politicalstatus" v-model="form.politicalstatus" type="select" :enumData="dict.politicalstatus" placeholder="璇烽€夋嫨鏀挎不闈㈣矊 "/>
+                            <Field label="鎵€灞為儴闂�" prop="deptId" v-model="form.deptId" placeholder="璇疯緭鍏ユ墍灞為儴闂�"/>
+                            <Field label="鎵€灞為儴闂ㄥ悕绉�" prop="deptName" v-model="form.deptName" placeholder="璇疯緭鍏ユ墍灞為儴闂ㄥ悕绉�"/>
+                            <Field label="鑱屼綅ID" prop="jobId" v-model="form.jobId" placeholder="璇疯緭鍏ヨ亴浣岻D"/>
+                            <Field label="鑱屼綅鍚嶇О" prop="jobName" v-model="form.jobName" placeholder="璇疯緭鍏ヨ亴浣嶅悕绉�"/>
+                            <Field label="鍛樺伐绫诲瀷" prop="staffType" v-model="form.staffType" type="select" :enumData="dict.staffType" placeholder="璇烽€夋嫨鍛樺伐绫诲瀷"/>
+                            <Field label="鍛樺伐鐘舵€�" prop="status" v-model="form.status" type="select" :enumData="dict.status" placeholder="璇烽€夋嫨鍛樺伐鐘舵€�"/>
+                            <Field label="鍏ヨ亴鏃堕棿" prop="entryDate" v-model="form.entryDate" type="date" />
+                            <Field label="绂昏亴鏃堕棿" prop="leaveDate" v-model="form.leaveDate" type="date" />
+                            <Field label="绂昏亴鍘熷洜" prop="leaveReason" v-model="form.leaveReason" type="textarea" placeholder="璇疯緭鍏ョ鑱屽師鍥�"/>
+                            <Field label="瀹℃牳鐘舵€�" prop="auditStatus" v-model="form.auditStatus" type="select" :enumData="dict.auditStatus" placeholder="璇烽€夋嫨瀹℃牳鐘舵€�"/>
+
+            </el-row>
+
+            <form-buttons @submit='submitForm' noCancelBtn />
+        </el-form>
+
+    </el-drawer>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    export default {
+        name: "StaffLeaveDetail",
+        mixins: [form],
+        components: {
+
+        },
+        created() {
+            this.changePath("staff/leave")
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鍛樺伐绂昏亴淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                direction:"rtl",
+                toString:[
+                    "gender",
+                    "politicalstatus",
+                    "staffType",
+                    "status",
+                    "auditStatus",
+                ],
+                toDate:[
+                    "birthday",
+                    "entryDate",
+                    "leaveDate",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    staffName: [
+                        {required: true,message: "璇疯緭鍏ュ憳宸ュ鍚�", trigger: "blur" },
+                        {max: 64,message: "鏈€澶氬彧鑳藉綍鍏�64涓瓧绗�",trigger: "blur",},
+                    ],
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/leave/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鍛樺伐绂昏亴淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "staff/leave/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鍛樺伐绂昏亴淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/leave/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鍛樺伐绂昏亴淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    staffId : null,
+                    staffName : "",
+                    gender : 1,
+                    birthday : null,
+                    photoPath : "",
+                    phoneNumber : "",
+                    idCard : "",
+                    workNum : "",
+                    politicalstatus : 1,
+                    deptId : null,
+                    deptName : "",
+                    jobId : null,
+                    jobName : "",
+                    staffType : 1,
+                    status : 1,
+                    entryDate : null,
+                    leaveDate : null,
+                    leaveReason : "",
+                    auditStatus : 0,
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/leave/list.vue b/attendance-performance-manager-ui/admin/src/views/staff/leave/list.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c7bc908ee73a9ad33e596303d766ebd88cd4bc9d
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/leave/list.vue
@@ -0,0 +1,108 @@
+<template>
+    <div class="page">
+        <LayoutTable :data="tableData" :config="tableConfig">
+                    </LayoutTable>
+
+
+        <drawer-show ref="drawerform" @ok="getData" />
+    </div>
+</template>
+
+<script>
+    /** 琛ㄥ崟寮瑰嚭妗嗘ā寮忛渶寮曞叆 */
+    import drawerShow from "./drawershow";
+    import table from "@/assets/mixins/table";
+    export default {
+        name: "StaffLeaveList",
+        components: {
+            drawerShow
+},
+        mixins: [table],
+        created() {
+        },
+        methods: {
+            /** 閲嶅啓鏂板鏂规硶 */
+            toAdd(row) {
+                this.$refs.drawerform.add(row);
+            },
+            /** 閲嶅啓缂栬緫鏂规硶 */
+            toEdit(row) {
+                this.$refs.drawerform.edit(row);
+            },
+            /** 閲嶅啓鏌ョ湅鏂规硶 */
+            toView(row) {
+                this.$refs.drawerform.view(row);
+            },
+
+        },
+        data() {
+            return {
+                config: {
+                    search: [
+                        {
+                            name: "staffName",
+                            type: "text",
+                            label: "鍛樺伐濮撳悕",
+                            fuzzy: true
+                        },
+                        {
+                            name: "politicalstatus",
+                            type: "select",
+                            label: "鏀挎不闈㈣矊 ",
+                            fuzzy: true
+                        },
+                        {
+                            name: "staffType",
+                            type: "select",
+                            label: "鍛樺伐绫诲瀷",
+                            fuzzy: true
+                        },
+                        {
+                            name: "status",
+                            type: "select",
+                            label: "鍛樺伐鐘舵€�",
+                            fuzzy: true
+                        },
+                        {
+                            name: "auditStatus",
+                            type: "select",
+                            label: "瀹℃牳鐘舵€�",
+                            fuzzy: true
+                        },
+                    ],
+                    columns: [
+                        {type: "selection", width: 60},
+                        {type: "index",label: "搴忓彿",width: 50},
+
+                        {label: "鍛樺伐濮撳悕", prop: "staffName"},
+
+                        {label: "鎬у埆", prop: "gender",formatter: this.formatter},
+
+                        {label: "鏀挎不闈㈣矊 ", prop: "politicalstatus",formatter: this.formatter},
+
+                        {label: "鍛樺伐绫诲瀷", prop: "staffType",formatter: this.formatter},
+
+                        {label: "鍛樺伐鐘舵€�", prop: "status",formatter: this.formatter},
+
+                        {label: "鍏ヨ亴鏃堕棿", prop: "entryDate", formatter: this.formatterDate},
+
+                        {label: "绂昏亴鏃堕棿", prop: "leaveDate", formatter: this.formatterDate},
+
+                        {label: "瀹℃牳鐘舵€�", prop: "auditStatus",formatter: this.formatter},
+
+                        {label: "鍒涘缓鐢ㄦ埛", prop: "createUserId", formatter: this.formatter},
+                        {
+                            label: "鎿嶄綔",
+                            width: 240,
+                            formatter: row => {
+                                return (
+                                    <table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
+                            );
+                            }
+                        }
+                    ]
+                }
+            };
+        }
+    };
+</script>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/leave/view.vue b/attendance-performance-manager-ui/admin/src/views/staff/leave/view.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c6e988fcfda6cc27258b0c337b76989c0b2d7152
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/leave/view.vue
@@ -0,0 +1,116 @@
+<template>
+    <layout-view>
+        <el-descriptions  :title="title" :column="column" :size="size" :colon="false" border>
+            <template slot="title">
+                <i class="el-icon-tickets"></i>
+                鍩烘湰璇︾粏淇℃伅
+            </template>
+            <template slot="extra">
+                <el-button type="primary" @click="$router.go(-1)" size="small">杩斿洖</el-button>
+            </template>
+                                    <el-descriptions-item label="鍛樺伐ID" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.staffId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍛樺伐濮撳悕" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.staffName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎬у埆" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("gender", form.gender) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍑虹敓鏃ユ湡" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.birthday)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鐓х墖" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.photoPath}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱旂郴鐢佃瘽" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.phoneNumber}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="韬唤璇佸彿鐮�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.idCard}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="宸ュ彿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.workNum}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鏀挎不闈㈣矊 " label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("politicalstatus", form.politicalstatus) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎵€灞為儴闂�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.deptId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎵€灞為儴闂ㄥ悕绉�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.deptName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱屼綅ID" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.jobId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱屼綅鍚嶇О" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.jobName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍛樺伐绫诲瀷" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("staffType", form.staffType) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍛樺伐鐘舵€�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("status", form.status) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍏ヨ亴鏃堕棿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.entryDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="绂昏亴鏃堕棿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.leaveDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="绂昏亴鍘熷洜" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.leaveReason}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="瀹℃牳鐘舵€�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("auditStatus", form.auditStatus) }}
+                        </el-descriptions-item>
+        </el-descriptions>
+
+    </layout-view>
+</template>
+
+<script>
+    import view from "@/assets/mixins/view";
+    export default {
+        mixins: [view],
+        components: {
+        },
+        methods: {
+
+        },
+        data() {
+            return {
+                size:"small",
+                column:2,
+                toString:[
+                    "gender",
+                    "politicalstatus",
+                    "staffType",
+                    "status",
+                    "auditStatus",
+                ],
+                toArrays: [
+
+                ],
+                toDate: [
+
+                ]
+            }
+        }
+    }
+</script>
+<style lang="less">
+    .labelClass{
+        width: 200px;
+    }
+    .el-descriptions__body{
+        margin-left: 5px;
+        margin-right: 5px;
+        color: #606266;
+        background-color: #FFF;
+    }
+    .contentClass{
+        width: 600px;
+    }
+</style>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/list.vue b/attendance-performance-manager-ui/admin/src/views/staff/list.vue
new file mode 100644
index 0000000000000000000000000000000000000000..cde68f1fd61875b0bcdbc8f16d3d6107c47857fe
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/list.vue
@@ -0,0 +1,102 @@
+<template>
+    <div class="page">
+        <LayoutTable :data="tableData" :config="tableConfig">
+                    </LayoutTable>
+
+
+        <drawer-show ref="drawerform" @ok="getData" />
+    </div>
+</template>
+
+<script>
+    /** 琛ㄥ崟寮瑰嚭妗嗘ā寮忛渶寮曞叆 */
+    import drawerShow from "./drawershow";
+    import table from "@/assets/mixins/table";
+    export default {
+        name: "StaffList",
+        components: {
+            drawerShow
+},
+        mixins: [table],
+        created() {
+        },
+        methods: {
+            /** 閲嶅啓鏂板鏂规硶 */
+            toAdd(row) {
+                this.$refs.drawerform.add(row);
+            },
+            /** 閲嶅啓缂栬緫鏂规硶 */
+            toEdit(row) {
+                this.$refs.drawerform.edit(row);
+            },
+            /** 閲嶅啓鏌ョ湅鏂规硶 */
+            toView(row) {
+                this.$refs.drawerform.view(row);
+            },
+
+        },
+        data() {
+            return {
+                config: {
+                    search: [
+                        {
+                            name: "name",
+                            type: "text",
+                            label: "鍛樺伐濮撳悕",
+                            fuzzy: true
+                        },
+                        {
+                            name: "politicalstatus",
+                            type: "select",
+                            label: "鏀挎不闈㈣矊 ",
+                            fuzzy: true
+                        },
+                        {
+                            name: "staffType",
+                            type: "select",
+                            label: "鍛樺伐绫诲瀷",
+                            fuzzy: true
+                        },
+                        {
+                            name: "status",
+                            type: "select",
+                            label: "鍛樺伐鐘舵€�",
+                            fuzzy: true
+                        },
+                    ],
+                    columns: [
+                        {type: "selection", width: 60},
+                        {type: "index",label: "搴忓彿",width: 50},
+
+                        {label: "鍛樺伐濮撳悕", prop: "name"},
+
+                        {label: "鎬у埆", prop: "gender",formatter: this.formatter},
+
+                        {label: "鏀挎不闈㈣矊 ", prop: "politicalstatus",formatter: this.formatter},
+
+                        {label: "鍛樺伐绫诲瀷", prop: "staffType",formatter: this.formatter},
+
+                        {label: "鍛樺伐鐘舵€�", prop: "status",formatter: this.formatter},
+
+                        {label: "鍏ヨ亴鏃堕棿", prop: "entryDate", formatter: this.formatterDate},
+
+                        {label: "杞鏃堕棿", prop: "regularDate", formatter: this.formatterDate},
+
+                        {label: "绂昏亴鏃堕棿", prop: "leaveDate", formatter: this.formatterDate},
+
+                        {label: "鍒涘缓鐢ㄦ埛", prop: "createUserId", formatter: this.formatter},
+                        {
+                            label: "鎿嶄綔",
+                            width: 240,
+                            formatter: row => {
+                                return (
+                                    <table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
+                            );
+                            }
+                        }
+                    ]
+                }
+            };
+        }
+    };
+</script>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/regular/dialogshow.vue b/attendance-performance-manager-ui/admin/src/views/staff/regular/dialogshow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e115f0cb601b12f048f933b07e1bac31af593041
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/regular/dialogshow.vue
@@ -0,0 +1,143 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-dialog :title="title" :visible.sync="open" width="90%" append-to-body>
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍛樺伐ID" prop="staffId" v-model="form.staffId" placeholder="璇疯緭鍏ュ憳宸D"/>
+                            <Field label="鍛樺伐濮撳悕" prop="staffName" v-model="form.staffName" placeholder="璇疯緭鍏ュ憳宸ュ鍚�"/>
+                            <Field label="鎬у埆" prop="gender" v-model="form.gender" type="select" :enumData="dict.gender" placeholder="璇烽€夋嫨鎬у埆"/>
+                            <Field label="鍑虹敓鏃ユ湡" prop="birthday" v-model="form.birthday" type="date" />
+                            <Field label="鐓х墖" prop="photoPath" v-model="form.photoPath" type="textarea" placeholder="璇疯緭鍏ョ収鐗�"/>
+                            <Field label="鑱旂郴鐢佃瘽" prop="phoneNumber" v-model="form.phoneNumber" placeholder="璇疯緭鍏ヨ仈绯荤數璇�"/>
+                            <Field label="韬唤璇佸彿鐮�" prop="idCard" v-model="form.idCard" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙风爜"/>
+                            <Field label="宸ュ彿" prop="workNum" v-model="form.workNum" placeholder="璇疯緭鍏ュ伐鍙�"/>
+                            <Field label="鏀挎不闈㈣矊 " prop="politicalstatus" v-model="form.politicalstatus" type="select" :enumData="dict.politicalstatus" placeholder="璇烽€夋嫨鏀挎不闈㈣矊 "/>
+                            <Field label="鎵€灞為儴闂�" prop="deptId" v-model="form.deptId" placeholder="璇疯緭鍏ユ墍灞為儴闂�"/>
+                            <Field label="鎵€灞為儴闂ㄥ悕绉�" prop="deptName" v-model="form.deptName" placeholder="璇疯緭鍏ユ墍灞為儴闂ㄥ悕绉�"/>
+                            <Field label="鑱屼綅ID" prop="jobId" v-model="form.jobId" placeholder="璇疯緭鍏ヨ亴浣岻D"/>
+                            <Field label="鑱屼綅鍚嶇О" prop="jobName" v-model="form.jobName" placeholder="璇疯緭鍏ヨ亴浣嶅悕绉�"/>
+                            <Field label="鍛樺伐绫诲瀷" prop="staffType" v-model="form.staffType" type="select" :enumData="dict.staffType" placeholder="璇烽€夋嫨鍛樺伐绫诲瀷"/>
+                            <Field label="鍛樺伐鐘舵€�" prop="status" v-model="form.status" type="select" :enumData="dict.status" placeholder="璇烽€夋嫨鍛樺伐鐘舵€�"/>
+                            <Field label="鍏ヨ亴鏃堕棿" prop="entryDate" v-model="form.entryDate" type="date" />
+                            <Field label="璁″垝杞鏃堕棿" prop="regularDate" v-model="form.regularDate" type="date" />
+                            <Field label="瀹℃牳鐘舵€�" prop="auditStatus" v-model="form.auditStatus" type="select" :enumData="dict.auditStatus" placeholder="璇烽€夋嫨瀹℃牳鐘舵€�"/>
+
+            </el-row>
+
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button type="primary" v-if="pageInfo.type !== 'view'" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    import dialogShow from "./dialogshow";
+    export default {
+        mixins: [form],
+        components: {
+            dialogShow ,
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鍛樺伐杞淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                toString:[
+                    "gender",
+                    "politicalstatus",
+                    "staffType",
+                    "status",
+                    "auditStatus",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    staffName: [
+                        {required: true,message: "璇疯緭鍏ュ憳宸ュ鍚�", trigger: "blur" },
+                        {max: 64,message: "鏈€澶氬彧鑳藉綍鍏�64涓瓧绗�",trigger: "blur",},
+                    ],
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/regular/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鍛樺伐杞淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "staff/regular/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鍛樺伐杞淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/regular/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鍛樺伐杞淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    staffId : null,
+                    staffName : "",
+                    gender : 1,
+                    birthday : null,
+                    photoPath : "",
+                    phoneNumber : "",
+                    idCard : "",
+                    workNum : "",
+                    politicalstatus : 1,
+                    deptId : null,
+                    deptName : "",
+                    jobId : null,
+                    jobName : "",
+                    staffType : 1,
+                    status : 1,
+                    entryDate : null,
+                    regularDate : null,
+                    auditStatus : 0,
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/regular/drawershow.vue b/attendance-performance-manager-ui/admin/src/views/staff/regular/drawershow.vue
new file mode 100644
index 0000000000000000000000000000000000000000..93570fe28856ebd01aaf0a7ba967a366120c09d8
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/regular/drawershow.vue
@@ -0,0 +1,154 @@
+<template>
+    <!-- 寮瑰嚭妗嗚〃鍗� -->
+    <el-drawer
+            :title="title"
+            :visible.sync="open"
+            :direction="direction"
+            size="50%">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+            <el-row>
+                                            <Field label="鍛樺伐ID" prop="staffId" v-model="form.staffId" placeholder="璇疯緭鍏ュ憳宸D"/>
+                            <Field label="鍛樺伐濮撳悕" prop="staffName" v-model="form.staffName" placeholder="璇疯緭鍏ュ憳宸ュ鍚�"/>
+                            <Field label="鎬у埆" prop="gender" v-model="form.gender" type="select" :enumData="dict.gender" placeholder="璇烽€夋嫨鎬у埆"/>
+                            <Field label="鍑虹敓鏃ユ湡" prop="birthday" v-model="form.birthday" type="date" />
+                            <Field label="鐓х墖" prop="photoPath" v-model="form.photoPath" type="textarea" placeholder="璇疯緭鍏ョ収鐗�"/>
+                            <Field label="鑱旂郴鐢佃瘽" prop="phoneNumber" v-model="form.phoneNumber" placeholder="璇疯緭鍏ヨ仈绯荤數璇�"/>
+                            <Field label="韬唤璇佸彿鐮�" prop="idCard" v-model="form.idCard" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙风爜"/>
+                            <Field label="宸ュ彿" prop="workNum" v-model="form.workNum" placeholder="璇疯緭鍏ュ伐鍙�"/>
+                            <Field label="鏀挎不闈㈣矊 " prop="politicalstatus" v-model="form.politicalstatus" type="select" :enumData="dict.politicalstatus" placeholder="璇烽€夋嫨鏀挎不闈㈣矊 "/>
+                            <Field label="鎵€灞為儴闂�" prop="deptId" v-model="form.deptId" placeholder="璇疯緭鍏ユ墍灞為儴闂�"/>
+                            <Field label="鎵€灞為儴闂ㄥ悕绉�" prop="deptName" v-model="form.deptName" placeholder="璇疯緭鍏ユ墍灞為儴闂ㄥ悕绉�"/>
+                            <Field label="鑱屼綅ID" prop="jobId" v-model="form.jobId" placeholder="璇疯緭鍏ヨ亴浣岻D"/>
+                            <Field label="鑱屼綅鍚嶇О" prop="jobName" v-model="form.jobName" placeholder="璇疯緭鍏ヨ亴浣嶅悕绉�"/>
+                            <Field label="鍛樺伐绫诲瀷" prop="staffType" v-model="form.staffType" type="select" :enumData="dict.staffType" placeholder="璇烽€夋嫨鍛樺伐绫诲瀷"/>
+                            <Field label="鍛樺伐鐘舵€�" prop="status" v-model="form.status" type="select" :enumData="dict.status" placeholder="璇烽€夋嫨鍛樺伐鐘舵€�"/>
+                            <Field label="鍏ヨ亴鏃堕棿" prop="entryDate" v-model="form.entryDate" type="date" />
+                            <Field label="璁″垝杞鏃堕棿" prop="regularDate" v-model="form.regularDate" type="date" />
+                            <Field label="瀹℃牳鐘舵€�" prop="auditStatus" v-model="form.auditStatus" type="select" :enumData="dict.auditStatus" placeholder="璇烽€夋嫨瀹℃牳鐘舵€�"/>
+
+            </el-row>
+
+            <form-buttons @submit='submitForm' noCancelBtn />
+        </el-form>
+
+    </el-drawer>
+</template>
+
+<script>
+    import form from "@/assets/mixins/formdialog";
+    export default {
+        name: "StaffRegularDetail",
+        mixins: [form],
+        components: {
+
+        },
+        created() {
+            this.changePath("staff/regular")
+        },
+        data() {
+            return {
+                // 閬僵灞�
+                loading: true,
+                // 寮瑰嚭灞傛爣棰�
+                title: "鍛樺伐杞淇℃伅",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                direction:"rtl",
+                toString:[
+                    "gender",
+                    "politicalstatus",
+                    "staffType",
+                    "status",
+                    "auditStatus",
+                ],
+                toDate:[
+                    "birthday",
+                    "entryDate",
+                    "regularDate",
+                ],
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    staffName: [
+                        {required: true,message: "璇疯緭鍏ュ憳宸ュ鍚�", trigger: "blur" },
+                        {max: 64,message: "鏈€澶氬彧鑳藉綍鍏�64涓瓧绗�",trigger: "blur",},
+                    ],
+                    createTime: [
+                        {required: true,message: "璇烽€夋嫨鍒涘缓鏃堕棿" },
+                    ],
+                }
+            };
+        },
+
+        methods: {
+            /** 缂栬緫 */
+            edit(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/regular/edit";
+                this.getData();
+                this.pageInfo.type="edit"
+                this.title = "淇敼鍛樺伐杞淇℃伅";
+            },
+            /** 鏂板 */
+            add(row) {
+                this.reset()
+                this.urls.currUrl = "staff/regular/add";
+                this.getData();
+                this.pageInfo.type="add"
+                this.title = "鏂板鍛樺伐杞淇℃伅";
+            },
+            /** 鏌ョ湅*/
+            view(row) {
+                this.reset()
+                this.query = { id: row.id };
+                this.urls.currUrl ="staff/regular/view";
+                this.getData();
+                this.pageInfo.type="view"
+                this.title = "鍛樺伐杞淇℃伅璇︾粏";
+            },
+            /**鍙栨秷鎸夐挳 */
+            cancel() {
+                this.open = false;
+            },
+            /**鑾峰彇鏁版嵁鍚庡脊妗� */
+            afterRender(data) {
+                this.open = true;
+            },
+
+            afterSubmit(data) {
+                this.open = false;
+                this.$emit("ok");
+            },
+
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    staffId : null,
+                    staffName : "",
+                    gender : 1,
+                    birthday : null,
+                    photoPath : "",
+                    phoneNumber : "",
+                    idCard : "",
+                    workNum : "",
+                    politicalstatus : 1,
+                    deptId : null,
+                    deptName : "",
+                    jobId : null,
+                    jobName : "",
+                    staffType : 1,
+                    status : 1,
+                    entryDate : null,
+                    regularDate : null,
+                    auditStatus : 0,
+                };
+                this.resetForm("form");
+            },
+            resetForm(refName) {
+                if (this.$refs[refName]) {
+                    this.$refs[refName].resetFields();
+                }
+            },
+        },
+    };
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/regular/list.vue b/attendance-performance-manager-ui/admin/src/views/staff/regular/list.vue
new file mode 100644
index 0000000000000000000000000000000000000000..428161d7b120138ca90bfda2c8e53b14222f6513
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/regular/list.vue
@@ -0,0 +1,108 @@
+<template>
+    <div class="page">
+        <LayoutTable :data="tableData" :config="tableConfig">
+                    </LayoutTable>
+
+
+        <drawer-show ref="drawerform" @ok="getData" />
+    </div>
+</template>
+
+<script>
+    /** 琛ㄥ崟寮瑰嚭妗嗘ā寮忛渶寮曞叆 */
+    import drawerShow from "./drawershow";
+    import table from "@/assets/mixins/table";
+    export default {
+        name: "StaffRegularList",
+        components: {
+            drawerShow
+},
+        mixins: [table],
+        created() {
+        },
+        methods: {
+            /** 閲嶅啓鏂板鏂规硶 */
+            toAdd(row) {
+                this.$refs.drawerform.add(row);
+            },
+            /** 閲嶅啓缂栬緫鏂规硶 */
+            toEdit(row) {
+                this.$refs.drawerform.edit(row);
+            },
+            /** 閲嶅啓鏌ョ湅鏂规硶 */
+            toView(row) {
+                this.$refs.drawerform.view(row);
+            },
+
+        },
+        data() {
+            return {
+                config: {
+                    search: [
+                        {
+                            name: "staffName",
+                            type: "text",
+                            label: "鍛樺伐濮撳悕",
+                            fuzzy: true
+                        },
+                        {
+                            name: "politicalstatus",
+                            type: "select",
+                            label: "鏀挎不闈㈣矊 ",
+                            fuzzy: true
+                        },
+                        {
+                            name: "staffType",
+                            type: "select",
+                            label: "鍛樺伐绫诲瀷",
+                            fuzzy: true
+                        },
+                        {
+                            name: "status",
+                            type: "select",
+                            label: "鍛樺伐鐘舵€�",
+                            fuzzy: true
+                        },
+                        {
+                            name: "auditStatus",
+                            type: "select",
+                            label: "瀹℃牳鐘舵€�",
+                            fuzzy: true
+                        },
+                    ],
+                    columns: [
+                        {type: "selection", width: 60},
+                        {type: "index",label: "搴忓彿",width: 50},
+
+                        {label: "鍛樺伐濮撳悕", prop: "staffName"},
+
+                        {label: "鎬у埆", prop: "gender",formatter: this.formatter},
+
+                        {label: "鏀挎不闈㈣矊 ", prop: "politicalstatus",formatter: this.formatter},
+
+                        {label: "鍛樺伐绫诲瀷", prop: "staffType",formatter: this.formatter},
+
+                        {label: "鍛樺伐鐘舵€�", prop: "status",formatter: this.formatter},
+
+                        {label: "鍏ヨ亴鏃堕棿", prop: "entryDate", formatter: this.formatterDate},
+
+                        {label: "璁″垝杞鏃堕棿", prop: "regularDate", formatter: this.formatterDate},
+
+                        {label: "瀹℃牳鐘舵€�", prop: "auditStatus",formatter: this.formatter},
+
+                        {label: "鍒涘缓鐢ㄦ埛", prop: "createUserId", formatter: this.formatter},
+                        {
+                            label: "鎿嶄綔",
+                            width: 240,
+                            formatter: row => {
+                                return (
+                                    <table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
+                            );
+                            }
+                        }
+                    ]
+                }
+            };
+        }
+    };
+</script>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/regular/view.vue b/attendance-performance-manager-ui/admin/src/views/staff/regular/view.vue
new file mode 100644
index 0000000000000000000000000000000000000000..1e51499a9eee4883abf8fc3fb092e514a351e713
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/regular/view.vue
@@ -0,0 +1,113 @@
+<template>
+    <layout-view>
+        <el-descriptions  :title="title" :column="column" :size="size" :colon="false" border>
+            <template slot="title">
+                <i class="el-icon-tickets"></i>
+                鍩烘湰璇︾粏淇℃伅
+            </template>
+            <template slot="extra">
+                <el-button type="primary" @click="$router.go(-1)" size="small">杩斿洖</el-button>
+            </template>
+                                    <el-descriptions-item label="鍛樺伐ID" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.staffId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍛樺伐濮撳悕" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.staffName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎬у埆" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("gender", form.gender) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍑虹敓鏃ユ湡" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.birthday)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鐓х墖" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.photoPath}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱旂郴鐢佃瘽" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.phoneNumber}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="韬唤璇佸彿鐮�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.idCard}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="宸ュ彿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.workNum}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鏀挎不闈㈣矊 " label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("politicalstatus", form.politicalstatus) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎵€灞為儴闂�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.deptId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎵€灞為儴闂ㄥ悕绉�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.deptName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱屼綅ID" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.jobId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱屼綅鍚嶇О" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.jobName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍛樺伐绫诲瀷" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("staffType", form.staffType) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍛樺伐鐘舵€�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("status", form.status) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍏ヨ亴鏃堕棿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.entryDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="璁″垝杞鏃堕棿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.regularDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="瀹℃牳鐘舵€�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("auditStatus", form.auditStatus) }}
+                        </el-descriptions-item>
+        </el-descriptions>
+
+    </layout-view>
+</template>
+
+<script>
+    import view from "@/assets/mixins/view";
+    export default {
+        mixins: [view],
+        components: {
+        },
+        methods: {
+
+        },
+        data() {
+            return {
+                size:"small",
+                column:2,
+                toString:[
+                    "gender",
+                    "politicalstatus",
+                    "staffType",
+                    "status",
+                    "auditStatus",
+                ],
+                toArrays: [
+
+                ],
+                toDate: [
+
+                ]
+            }
+        }
+    }
+</script>
+<style lang="less">
+    .labelClass{
+        width: 200px;
+    }
+    .el-descriptions__body{
+        margin-left: 5px;
+        margin-right: 5px;
+        color: #606266;
+        background-color: #FFF;
+    }
+    .contentClass{
+        width: 600px;
+    }
+</style>
\ No newline at end of file
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/view.vue b/attendance-performance-manager-ui/admin/src/views/staff/view.vue
new file mode 100644
index 0000000000000000000000000000000000000000..3bf9bb90c81e1eab38bf74830916f5ee11855207
--- /dev/null
+++ b/attendance-performance-manager-ui/admin/src/views/staff/view.vue
@@ -0,0 +1,115 @@
+<template>
+    <layout-view>
+        <el-descriptions  :title="title" :column="column" :size="size" :colon="false" border>
+            <template slot="title">
+                <i class="el-icon-tickets"></i>
+                鍩烘湰璇︾粏淇℃伅
+            </template>
+            <template slot="extra">
+                <el-button type="primary" @click="$router.go(-1)" size="small">杩斿洖</el-button>
+            </template>
+                                    <el-descriptions-item label="鍛樺伐濮撳悕" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.name}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎬у埆" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("gender", form.gender) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍑虹敓鏃ユ湡" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.birthday)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鐓х墖" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.photoPath}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱旂郴鐢佃瘽" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.phoneNumber}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="韬唤璇佸彿鐮�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.idCard}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="宸ュ彿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.workNum}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鏀挎不闈㈣矊 " label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("politicalstatus", form.politicalstatus) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎵€灞為儴闂�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.deptId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鎵€灞為儴闂ㄥ悕绉�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.deptName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱屼綅ID" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.positionId}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鑱屼綅鍚嶇О" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.positionName}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍛樺伐绫诲瀷" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("staffType", form.staffType) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍛樺伐鐘舵€�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatters("status", form.status) }}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍏ヨ亴鐧昏琛�" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.registerPath}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="鍏ヨ亴鏃堕棿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.entryDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="杞鏃堕棿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.regularDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="绂昏亴鏃堕棿" label-class-name="labelClass" content-class-name="contentClass">
+                            {{ util_formatterDate(form.leaveDate)}}
+                        </el-descriptions-item>
+                        <el-descriptions-item label="澶囨敞" label-class-name="labelClass" content-class-name="contentClass">
+                            {{form.remark}}
+                        </el-descriptions-item>
+        </el-descriptions>
+
+    </layout-view>
+</template>
+
+<script>
+    import view from "@/assets/mixins/view";
+    export default {
+        mixins: [view],
+        components: {
+        },
+        methods: {
+
+        },
+        data() {
+            return {
+                size:"small",
+                column:2,
+                toString:[
+                    "gender",
+                    "politicalstatus",
+                    "staffType",
+                    "status",
+                ],
+                toArrays: [
+
+                ],
+                toDate: [
+
+                ]
+            }
+        }
+    }
+</script>
+<style lang="less">
+    .labelClass{
+        width: 200px;
+    }
+    .el-descriptions__body{
+        margin-left: 5px;
+        margin-right: 5px;
+        color: #606266;
+        background-color: #FFF;
+    }
+    .contentClass{
+        width: 600px;
+    }
+</style>
\ No newline at end of file
diff --git a/attendance-performance-manager/src/test/java/com/mortals/httpclient/http-client.env.json b/attendance-performance-manager/src/test/java/com/mortals/httpclient/http-client.env.json
index da5b4a2028aa393c398d92dcb42b65a9e400198a..dd57c56f9daa2073b7357745463354eaf67245af 100644
--- a/attendance-performance-manager/src/test/java/com/mortals/httpclient/http-client.env.json
+++ b/attendance-performance-manager/src/test/java/com/mortals/httpclient/http-client.env.json
@@ -1,10 +1,9 @@
 {
   "local": {
-    "baseUrl": "http://127.0.0.1:17400/refined",
-    "baseLogin": "http://127.0.0.1:18222/m"
+    "baseUrl": "http://127.0.0.1:17500/attendance"
   },
   "test": {
-    "baseUrl": "http://192.168.0.98:11091/m",
+    "baseUrl": "http://192.168.0.98:11039/attendance",
     "baseLogin": "http://192.168.0.98:11078/base"
   },
   "portal": {
diff --git a/db/module.sql b/db/module.sql
index 70a2730c56d7e6037c62d5c1623d3e50fcac2bcf..81b632421edb8a70c69f18c5a010187abaf338f0 100644
--- a/db/module.sql
+++ b/db/module.sql
@@ -364,7 +364,7 @@ CREATE TABLE mortals_xhx_attendance_leave_record(
                                                     `duration` int(9)      COMMENT '鏃堕暱,鍗曚綅绉�',
                                                     `reason` text      COMMENT '璇峰亣浜嬬敱',
                                                     `approverId` bigint(20)      COMMENT '瀹℃壒璐熻矗浜篒d',
-                                                    `approver` varchar      COMMENT '瀹℃壒璐熻矗浜�',
+                                                    `approver` varchar(64)      COMMENT '瀹℃壒璐熻矗浜�',
                                                     `attachment` varchar(255)      COMMENT '闄勪欢',
                                                     `attachmentPath` varchar(255)      COMMENT '闄勪欢璺緞',
                                                     `remark` varchar(255)      COMMENT '澶囨敞',