diff --git a/orange-admin-service/.DS_Store b/orange-admin-service/.DS_Store
new file mode 100644
index 00000000..f88965e1
Binary files /dev/null and b/orange-admin-service/.DS_Store differ
diff --git a/orange-admin-service/.gitignore b/orange-admin-service/.gitignore
new file mode 100644
index 00000000..ac242580
--- /dev/null
+++ b/orange-admin-service/.gitignore
@@ -0,0 +1,26 @@
+/target/
+!.mvn/wrapper/maven-wrapper.jar
+/.mvn/*
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/build/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
\ No newline at end of file
diff --git a/orange-admin-service/README.md b/orange-admin-service/README.md
new file mode 100644
index 00000000..6a1d5465
--- /dev/null
+++ b/orange-admin-service/README.md
@@ -0,0 +1,5 @@
+### 服务启动环境依赖
+---
+
+在当前工程业务应用服务或Job服务启动前,需按如下顺序依次启动下列中间件。
+- XXL-Job (可选,仅当启动Job服务时使用)
diff --git a/orange-admin-service/application/.DS_Store b/orange-admin-service/application/.DS_Store
new file mode 100644
index 00000000..ee771938
Binary files /dev/null and b/orange-admin-service/application/.DS_Store differ
diff --git a/orange-admin-service/application/pom.xml b/orange-admin-service/application/pom.xml
new file mode 100644
index 00000000..3aa12b80
--- /dev/null
+++ b/orange-admin-service/application/pom.xml
@@ -0,0 +1,81 @@
+
+
+ 4.0.0
+
+
+ com.orange.admin
+ OrangeAdmin
+ 1.0.0
+
+
+ application
+ 1.0.0
+ application
+ jar
+
+
+
+
+ com.orange.admin
+ common-biz
+ 1.0.0
+
+
+
+
+
+
+ src/main/resources
+
+ **/*.*
+
+ false
+
+
+ src/main/java
+
+ **/*.xml
+
+ false
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot.version}
+
+
+
+ repackage
+
+
+
+
+
+
+ org.mybatis.generator
+ mybatis-generator-maven-plugin
+ ${mybatis-generator.version}
+
+ ${project.basedir}/src/main/resources/generator/generatorConfig.xml
+ true
+ true
+
+
+
+ mysql
+ mysql-connector-java
+ 8.0.13
+
+
+ tk.mybatis
+ mapper
+ 4.0.0
+
+
+
+
+
+
diff --git a/orange-admin-service/application/src/main/java/com/orange/admin/MyApplication.java b/orange-admin-service/application/src/main/java/com/orange/admin/MyApplication.java
new file mode 100644
index 00000000..0df246aa
--- /dev/null
+++ b/orange-admin-service/application/src/main/java/com/orange/admin/MyApplication.java
@@ -0,0 +1,12 @@
+package com.orange.admin;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class MyApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(MyApplication.class, args);
+ }
+}
diff --git a/orange-admin-service/application/src/main/java/com/orange/admin/app/controller/AreaCodeController.java b/orange-admin-service/application/src/main/java/com/orange/admin/app/controller/AreaCodeController.java
new file mode 100644
index 00000000..da7f958f
--- /dev/null
+++ b/orange-admin-service/application/src/main/java/com/orange/admin/app/controller/AreaCodeController.java
@@ -0,0 +1,56 @@
+package com.orange.admin.app.controller;
+
+import cn.jimmyshi.beanquery.BeanQuery;
+import com.orange.admin.app.model.AreaCode;
+import com.orange.admin.app.service.AreaCodeService;
+import com.orange.admin.common.core.object.ResponseResult;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.*;
+
+/**
+ * 行政区划数据访问接口类。
+ *
+ * @author Stephen.Liu
+ * @date 2020-04-11
+ */
+@RestController
+@RequestMapping("/admin/app/areaCode")
+public class AreaCodeController {
+
+ @Autowired
+ private AreaCodeService areaCodeService;
+
+ /**
+ * 按照字典的形式返回行政区划列表。
+ *
+ * @return 字典形式的行政区划列表。
+ */
+ @GetMapping("/listDictAreaCode")
+ public ResponseResult> listDictAreaCode() {
+ List resultList = areaCodeService.getAllList();
+ return ResponseResult.success(BeanQuery.select(
+ "parentId as parentId", "areaId as id", "areaName as name").executeFrom(resultList));
+ }
+
+ /**
+ * 根据上级行政区划Id获取其下级行政区划列表。
+ *
+ * @param parentId 上级行政区划Id。
+ * @return 按照字典的形式返回下级行政区划列表。
+ */
+ @GetMapping("/listDictAreaCodeByParentId")
+ public ResponseResult> listDictAreaCodeByParentId(@RequestParam(required = false) Long parentId) {
+ Collection resultList = areaCodeService.getListByParentId(parentId);
+ if (CollectionUtils.isEmpty(resultList)) {
+ return ResponseResult.success(new LinkedList<>());
+ }
+ return ResponseResult.success(BeanQuery.select(
+ "parentId as parentId", "areaId as id", "areaName as name").executeFrom(resultList));
+ }
+}
diff --git a/orange-admin-service/application/src/main/java/com/orange/admin/app/controller/TeacherController.java b/orange-admin-service/application/src/main/java/com/orange/admin/app/controller/TeacherController.java
new file mode 100644
index 00000000..d86779c7
--- /dev/null
+++ b/orange-admin-service/application/src/main/java/com/orange/admin/app/controller/TeacherController.java
@@ -0,0 +1,199 @@
+package com.orange.admin.app.controller;
+
+import cn.jimmyshi.beanquery.BeanQuery;
+import com.github.pagehelper.PageHelper;
+import com.orange.admin.app.model.*;
+import com.orange.admin.app.service.*;
+import com.orange.admin.upms.model.*;
+import com.orange.admin.common.core.object.*;
+import com.orange.admin.common.core.util.*;
+import com.orange.admin.common.core.constant.ErrorCodeEnum;
+import com.orange.admin.common.core.annotation.MyRequestBody;
+import com.orange.admin.common.core.validator.UpdateGroup;
+import lombok.extern.slf4j.Slf4j;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+import javax.validation.groups.Default;
+
+/**
+ * 老师数据源操作控制器类。
+ *
+ * @author Stephen.Liu
+ * @date 2020-04-11
+ */
+@Slf4j
+@RestController
+@RequestMapping("/admin/app/teacher")
+public class TeacherController {
+
+ @Autowired
+ private TeacherService teacherService;
+
+ /**
+ * 新增老师数据源数据。
+ *
+ * @param teacher 新增对象。
+ * @return 应答结果对象,包含新增对象主键Id。
+ */
+ @PostMapping("/add")
+ public ResponseResult> add(@MyRequestBody Teacher teacher) {
+ ErrorCodeEnum errorCodeEnum = ErrorCodeEnum.NO_ERROR;
+ String errorMessage;
+ JSONObject responseData = null;
+ do {
+ errorMessage = MyCommonUtil.getModelValidationError(teacher);
+ if (errorMessage != null) {
+ errorCodeEnum = ErrorCodeEnum.DATA_VALIDATAED_FAILED;
+ break;
+ }
+ // 验证关联Id的数据合法性
+ VerifyResult verifyResult = teacherService.verifyRelatedData(teacher, null);
+ if (!verifyResult.isSuccess()) {
+ errorCodeEnum = ErrorCodeEnum.DATA_VALIDATAED_FAILED;
+ errorMessage = verifyResult.getErrorMessage();
+ break;
+ }
+ teacher = teacherService.saveNew(teacher);
+ responseData = new JSONObject();
+ responseData.put("teacherId", teacher.getTeacherId());
+ } while (false);
+ return ResponseResult.create(errorCodeEnum, errorMessage, responseData);
+ }
+
+ /**
+ * 更新老师数据源数据。
+ *
+ * @param teacher 更新对象。
+ * @return 应答结果对象。
+ */
+ @PostMapping("/update")
+ public ResponseResult> update(@MyRequestBody Teacher teacher) {
+ ErrorCodeEnum errorCodeEnum = ErrorCodeEnum.NO_ERROR;
+ String errorMessage;
+ do {
+ errorMessage = MyCommonUtil.getModelValidationError(teacher, Default.class, UpdateGroup.class);
+ if (errorMessage != null) {
+ errorCodeEnum = ErrorCodeEnum.DATA_VALIDATAED_FAILED;
+ break;
+ }
+ // 验证关联Id的数据合法性
+ Teacher originalTeacher = teacherService.getById(teacher.getTeacherId());
+ if (originalTeacher == null) {
+ errorCodeEnum = ErrorCodeEnum.DATA_NOT_EXIST;
+ //TODO 修改下面方括号中的话述
+ errorMessage = "数据验证失败,当前 [数据] 并不存在,请刷新后重试!";
+ break;
+ }
+ // 验证关联Id的数据合法性
+ VerifyResult verifyResult = teacherService.verifyRelatedData(teacher, originalTeacher);
+ if (!verifyResult.isSuccess()) {
+ errorCodeEnum = ErrorCodeEnum.DATA_VALIDATAED_FAILED;
+ errorMessage = verifyResult.getErrorMessage();
+ break;
+ }
+ if (!teacherService.update(teacher, originalTeacher)) {
+ errorCodeEnum = ErrorCodeEnum.DATA_NOT_EXIST;
+ break;
+ }
+ } while (false);
+ return ResponseResult.create(errorCodeEnum, errorMessage);
+ }
+
+ /**
+ * 删除老师数据源数据。
+ *
+ * @param teacherId 删除对象主键Id。
+ * @return 应答结果对象。
+ */
+ @PostMapping("/delete")
+ public ResponseResult> delete(@MyRequestBody Long teacherId) {
+ ErrorCodeEnum errorCodeEnum = ErrorCodeEnum.NO_ERROR;
+ String errorMessage = null;
+ do {
+ if (MyCommonUtil.existBlankArgument(teacherId)) {
+ errorCodeEnum = ErrorCodeEnum.ARGUMENT_NULL_EXIST;
+ break;
+ }
+ // 验证关联Id的数据合法性
+ Teacher originalTeacher = teacherService.getById(teacherId);
+ if (originalTeacher == null) {
+ errorCodeEnum = ErrorCodeEnum.DATA_NOT_EXIST;
+ //TODO 修改下面方括号中的话述
+ errorMessage = "数据验证失败,当前 [对象] 并不存在,请刷新后重试!";
+ break;
+ }
+ if (!teacherService.remove(teacherId)) {
+ errorCodeEnum = ErrorCodeEnum.DATA_NOT_EXIST;
+ errorMessage = "数据操作失败,删除的对象不存在,请刷新后重试!";
+ break;
+ }
+ } while (false);
+ return ResponseResult.create(errorCodeEnum, errorMessage);
+ }
+
+ /**
+ * 列出符合过滤条件的老师数据源列表。
+ *
+ * @param teacherFilter 过滤对象。
+ * @param sysDeptFilter 一对一从表过滤对象。
+ * @param orderParam 排序参数。
+ * @param pageParam 分页参数。
+ * @return 应答结果对象,包含查询结果集。
+ */
+ @PostMapping("/list")
+ public ResponseResult> list(
+ @MyRequestBody Teacher teacherFilter,
+ @MyRequestBody SysDept sysDeptFilter,
+ @MyRequestBody MyOrderParam orderParam,
+ @MyRequestBody MyPageParam pageParam) {
+ if (pageParam != null) {
+ PageHelper.startPage(pageParam.getPageNum(), pageParam.getPageSize());
+ }
+ String orderBy = MyOrderParam.buildOrderBy(orderParam, Teacher.class);
+ List resultList =
+ teacherService.getTeacherListWithRelation(teacherFilter, sysDeptFilter, orderBy);
+ return ResponseResult.success(MyPageUtil.makeResponseData(resultList));
+ }
+
+ /**
+ * 查看指定老师数据源对象详情。
+ *
+ * @param teacherId 指定对象主键Id。
+ * @return 应答结果对象,包含对象详情。
+ */
+ @GetMapping("/view")
+ public ResponseResult view(@RequestParam Long teacherId) {
+ ErrorCodeEnum errorCodeEnum = ErrorCodeEnum.NO_ERROR;
+ String errorMessage = null;
+ Teacher teacher = null;
+ do {
+ if (MyCommonUtil.existBlankArgument(teacherId)) {
+ errorCodeEnum = ErrorCodeEnum.ARGUMENT_NULL_EXIST;
+ break;
+ }
+ teacher = teacherService.getByIdWithRelation(teacherId);
+ if (teacher == null) {
+ errorCodeEnum = ErrorCodeEnum.DATA_NOT_EXIST;
+ break;
+ }
+ } while (false);
+ return ResponseResult.create(errorCodeEnum, errorMessage, teacher);
+ }
+
+ /**
+ * 以字典形式返回全部老师数据源数据集合。字典的键值为[teacherId, teacherName]。
+ * 白名单接口,登录用户均可访问。
+ *
+ * @param filter 过滤对象。
+ * @return 应答结果对象,包含的数据为 List