合并 #1

Closed
p28j4qoim wants to merge 0 commits from master into main

@ -8,5 +8,5 @@
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_19" default="true" project-jdk-name="corretto-19" project-jdk-type="JavaSDK" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="corretto-1.8" project-jdk-type="JavaSDK" />
</project>

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
<mapping directory="" vcs="Git" />
</component>
</project>

@ -1,254 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ArtifactsWorkspaceSettings">
<artifacts-to-build>
<artifact name="kuaidizhan:war exploded" />
</artifacts-to-build>
</component>
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="682fdd82-c05b-4cc6-af2f-4b67dd292c20" name="更改" comment="">
<change afterPath="$PROJECT_DIR$/src/main/java/com/controller/AntiLeechServlet.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/controller/ExpressItem.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/controller/ExpressIteml.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/controller/IgnoreAuth.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/controller/OverduePackageService.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/controller/PickupCodeService.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/controller/UserManagementService.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/model/enums/TypeEnum.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/controller/CommonController.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/controller/CommonController.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/controller/ZhandianController.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/controller/ZhandianController.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/main.iml" beforeDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Class" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/src/main/java" />
<option name="ROOT_SYNC" value="DONT_SYNC" />
</component>
<component name="LogFilters">
<option name="FILTER_ERRORS" value="false" />
<option name="FILTER_WARNINGS" value="false" />
<option name="FILTER_INFO" value="true" />
<option name="FILTER_DEBUG" value="true" />
<option name="CUSTOM_FILTER" />
</component>
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 1
}</component>
<component name="ProjectId" id="2vX9hZLqUjsroXdgXf6kriQDRVP" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;ModuleVcsDetector.initialDetectionPerformed&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;Tomcat 服务器.Tomcat9.executor&quot;: &quot;Run&quot;,
&quot;git-widget-placeholder&quot;: &quot;main&quot;,
&quot;kotlin-language-version-configured&quot;: &quot;true&quot;,
&quot;last_opened_file_path&quot;: &quot;C:/Users/Administrator/Desktop/合肥师范学院/ssm076校园快递一站式服务系统+jsp/kuaidizhan/src/main/java/com&quot;,
&quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
&quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
&quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
&quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
&quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
&quot;project.structure.last.edited&quot;: &quot;工件&quot;,
&quot;project.structure.proportion&quot;: &quot;0.15&quot;,
&quot;project.structure.side.proportion&quot;: &quot;0.2&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;configurable.group.tools&quot;,
&quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
}
}</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="C:\Users\Administrator\Desktop\合肥师范学院\ssm076校园快递一站式服务系统+jsp\kuaidizhan\src\main\java\com" />
<recent name="C:\Users\Administrator\Desktop\合肥师范学院\ssm076校园快递一站式服务系统+jsp\kuaidizhan\src\main\webapp\WEB-INF" />
<recent name="C:\Users\Administrator\Desktop\合肥师范学院\ssm076校园快递一站式服务系统+jsp\kuaidizhan\src\main\java\com\controller" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="C:\Users\Administrator\Desktop\合肥师范学院\ssm076校园快递一站式服务系统+jsp\kuaidizhan\src\main\java" />
</key>
</component>
<component name="RunManager">
<configuration name="Tomcat9" type="#com.intellij.j2ee.web.tomcat.TomcatRunConfigurationFactory" factoryName="Local" APPLICATION_SERVER_NAME="Tomcat9" ALTERNATIVE_JRE_ENABLED="false" nameIsGenerated="true">
<option name="UPDATING_POLICY" value="restart-server" />
<deployment>
<artifact name="kuaidizhan:war exploded">
<settings>
<option name="CONTEXT_PATH" value="/kuaidizhan_war_exploded" />
</settings>
</artifact>
</deployment>
<server-settings>
<option name="BASE_DIRECTORY_NAME" value="057a3370-f903-49f3-ae0d-45680e48afb5" />
</server-settings>
<predefined_log_file enabled="true" id="Tomcat" />
<predefined_log_file enabled="true" id="Tomcat Catalina" />
<predefined_log_file id="Tomcat Manager" />
<predefined_log_file id="Tomcat Host Manager" />
<predefined_log_file id="Tomcat Localhost Access" />
<RunnerSettings RunnerId="Debug">
<option name="DEBUG_PORT" value="58199" />
</RunnerSettings>
<ConfigurationWrapper VM_VAR="JAVA_OPTS" RunnerId="Cover">
<option name="USE_ENV_VARIABLES" value="true" />
<STARTUP>
<option name="USE_DEFAULT" value="true" />
<option name="SCRIPT" value="" />
<option name="VM_PARAMETERS" value="" />
<option name="PROGRAM_PARAMETERS" value="" />
</STARTUP>
<SHUTDOWN>
<option name="USE_DEFAULT" value="true" />
<option name="SCRIPT" value="" />
<option name="VM_PARAMETERS" value="" />
<option name="PROGRAM_PARAMETERS" value="" />
</SHUTDOWN>
</ConfigurationWrapper>
<ConfigurationWrapper VM_VAR="JAVA_OPTS" RunnerId="Debug">
<option name="USE_ENV_VARIABLES" value="true" />
<STARTUP>
<option name="USE_DEFAULT" value="true" />
<option name="SCRIPT" value="" />
<option name="VM_PARAMETERS" value="" />
<option name="PROGRAM_PARAMETERS" value="" />
</STARTUP>
<SHUTDOWN>
<option name="USE_DEFAULT" value="true" />
<option name="SCRIPT" value="" />
<option name="VM_PARAMETERS" value="" />
<option name="PROGRAM_PARAMETERS" value="" />
</SHUTDOWN>
</ConfigurationWrapper>
<ConfigurationWrapper VM_VAR="JAVA_OPTS" RunnerId="Profile">
<option name="USE_ENV_VARIABLES" value="true" />
<STARTUP>
<option name="USE_DEFAULT" value="true" />
<option name="SCRIPT" value="" />
<option name="VM_PARAMETERS" value="" />
<option name="PROGRAM_PARAMETERS" value="" />
</STARTUP>
<SHUTDOWN>
<option name="USE_DEFAULT" value="true" />
<option name="SCRIPT" value="" />
<option name="VM_PARAMETERS" value="" />
<option name="PROGRAM_PARAMETERS" value="" />
</SHUTDOWN>
</ConfigurationWrapper>
<ConfigurationWrapper VM_VAR="JAVA_OPTS" RunnerId="Run">
<option name="USE_ENV_VARIABLES" value="true" />
<STARTUP>
<option name="USE_DEFAULT" value="true" />
<option name="SCRIPT" value="" />
<option name="VM_PARAMETERS" value="" />
<option name="PROGRAM_PARAMETERS" value="" />
</STARTUP>
<SHUTDOWN>
<option name="USE_DEFAULT" value="true" />
<option name="SCRIPT" value="" />
<option name="VM_PARAMETERS" value="" />
<option name="PROGRAM_PARAMETERS" value="" />
</SHUTDOWN>
</ConfigurationWrapper>
<method v="2">
<option name="Make" enabled="true" />
<option name="BuildArtifacts" enabled="true">
<artifact name="kuaidizhan:war exploded" />
</option>
</method>
</configuration>
</component>
<component name="SharedIndexes">
<attachedChunks>
<set>
<option value="bundled-jdk-9823dce3aa75-fbdcb00ec9e3-intellij.indexing.shared.core-IU-251.23774.435" />
<option value="bundled-js-predefined-d6986cc7102b-f27c65a3e318-JavaScript-IU-251.23774.435" />
</set>
</attachedChunks>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="应用程序级" UseSingleDictionary="true" transferred="true" />
<component name="StructureViewState">
<option name="selectedTab" value="逻辑" />
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="默认任务">
<changelist id="682fdd82-c05b-4cc6-af2f-4b67dd292c20" name="更改" comment="" />
<created>1744280671626</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1744280671626</updated>
<workItem from="1744280672775" duration="39000" />
<workItem from="1744280743010" duration="312000" />
<workItem from="1745840073782" duration="4327000" />
<workItem from="1745911770182" duration="11018000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="RECENT_FILTERS">
<map>
<entry key="User">
<value>
<list>
<RecentGroup>
<option name="FILTER_VALUES">
<option value="*" />
</option>
</RecentGroup>
</list>
</value>
</entry>
</map>
</option>
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State>
<option name="FILTERS">
<map>
<entry key="branch">
<value>
<list>
<option value="master" />
</list>
</value>
</entry>
<entry key="user">
<value>
<list>
<option value="*" />
</list>
</value>
</entry>
</map>
</option>
</State>
</value>
</entry>
</map>
</option>
</component>
<component name="XSLT-Support.FileAssociations.UIState">
<expand />
<select />
</component>
</project>

217
db.sql

@ -1,217 +0,0 @@
/*
SQLyog Ultimate v11.3 (64 bit)
MySQL - 5.7.32-log : Database - kuaidizhan
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`kuaidizhan` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `kuaidizhan`;
/*Table structure for table `config` */
DROP TABLE IF EXISTS `config`;
CREATE TABLE `config` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(100) NOT NULL COMMENT '配置参数名称',
`value` varchar(100) DEFAULT NULL COMMENT '配置参数值',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='配置文件';
/*Data for the table `config` */
insert into `config`(`id`,`name`,`value`) values (1,'picture1','http://localhost:8080/fd-ssmj/upload/1613705295135.jpg'),(2,'picture2','http://localhost:8080/fd-ssmj/upload/1613705301525.jpg'),(3,'picture3','http://localhost:8080/fd-ssmj/upload/1613799912302.JPG'),(4,'picture4','http://localhost:8080/fd-ssmj/upload/1613705325348.jpg'),(5,'picture5','http://localhost:8080/fd-ssmj/upload/1613705332544.jpg'),(6,'homepage','http://localhost:8080/fd-ssmj/upload/1613705342094.jpg');
/*Table structure for table `daiqu` */
DROP TABLE IF EXISTS `daiqu`;
CREATE TABLE `daiqu` (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`dqname` varchar(200) DEFAULT NULL COMMENT '快递名称 Search111',
`zhandian_id` tinyint(4) DEFAULT NULL COMMENT '站点',
`yonghu_id` tinyint(4) DEFAULT NULL COMMENT '用户',
`kddx_types` tinyint(4) DEFAULT NULL COMMENT '快递大小 Search111',
`dqphone` varchar(200) DEFAULT NULL COMMENT '手机号',
`takecode` varchar(200) DEFAULT NULL COMMENT '取件码',
`kdzt_types` tinyint(4) DEFAULT NULL COMMENT '快递状态',
`pickup_time` datetime DEFAULT NULL COMMENT '取件时间 Search111',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COMMENT='待取件表';
/*Data for the table `daiqu` */
insert into `daiqu`(`id`,`dqname`,`zhandian_id`,`yonghu_id`,`kddx_types`,`dqphone`,`takecode`,`kdzt_types`,`pickup_time`) values (6,'快递1',4,3,1,'17787788787','d4334b',2,'2021-03-12 16:15:21'),(7,'快递2',3,3,2,'17787788787','6e185e',2,'2021-03-12 16:17:59'),(11,'快递3',2,2,1,'222222222','b76997',1,NULL);
/*Table structure for table `daiquren` */
DROP TABLE IF EXISTS `daiquren`;
CREATE TABLE `daiquren` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`name` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '用户名称 Search111',
`username` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '账号',
`password` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '密码',
`sex_types` tinyint(4) DEFAULT NULL COMMENT '性别 Search111',
`img_photo` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '头像',
`phone` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '联系电话',
`role` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '身份',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=102 DEFAULT CHARSET=latin1;
/*Data for the table `daiquren` */
insert into `daiquren`(`id`,`name`,`username`,`password`,`sex_types`,`img_photo`,`phone`,`role`) values (100,'张三','111','111',1,'http://localhost:8080/kuaidizhan/file/download?fileName=1615534764456.jpg','11111','代取人'),(101,'李四','222','222',2,'http://localhost:8080/kuaidizhan/file/download?fileName=1615534757452.jpg','22222','代取人');
/*Table structure for table `dictionary` */
DROP TABLE IF EXISTS `dictionary`;
CREATE TABLE `dictionary` (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`dic_code` varchar(200) DEFAULT NULL COMMENT '字段',
`dic_name` varchar(200) DEFAULT NULL COMMENT '字段名',
`code_index` tinyint(4) DEFAULT NULL COMMENT '编码',
`index_name` varchar(200) DEFAULT NULL COMMENT '编码名字',
`super_id` int(11) DEFAULT NULL COMMENT '父字段id',
`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='字典表';
/*Data for the table `dictionary` */
insert into `dictionary`(`id`,`dic_code`,`dic_name`,`code_index`,`index_name`,`super_id`,`create_time`) values (1,'sex_types','性别',1,'',NULL,'2021-03-15 11:41:54'),(2,'sex_types','性别',2,'',NULL,'2021-03-15 11:41:54'),(3,'kddx_types','快递大小',1,'小件',NULL,'2021-03-15 11:41:54'),(4,'kddx_types','快递大小',2,'中件',NULL,'2021-03-15 11:41:54'),(5,'kddx_types','快递大小',3,'大件',NULL,'2021-03-15 11:41:54'),(6,'kdzt_types','快递状态',1,'待取',NULL,'2021-03-15 11:41:54'),(7,'kdzt_types','快递状态',2,'已取',NULL,'2021-03-15 11:41:54'),(8,'kdzt_types','快递状态',3,'已发布订单',NULL,'2021-03-15 11:41:54'),(9,'jdzt_types','快递状态',1,'未接',NULL,'2021-03-15 11:41:54'),(10,'jdzt_types','快递状态',2,'已接',NULL,'2021-03-15 11:41:54'),(11,'kdlx_types','快递类型',1,'取件',NULL,'2021-03-15 11:41:54'),(12,'kdlx_types','快递类型',2,'寄件',NULL,'2021-03-15 11:41:54'),(13,'ddzt_types','订单状态',1,'正在路上',NULL,'2021-03-15 11:41:54'),(14,'ddzt_types','订单状态',2,'已完成',NULL,'2021-03-15 11:41:54');
/*Table structure for table `jiedan` */
DROP TABLE IF EXISTS `jiedan`;
CREATE TABLE `jiedan` (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`odd` varchar(200) DEFAULT NULL COMMENT '单号',
`daiqukuaidimc` varchar(200) DEFAULT NULL COMMENT '快递名称',
`jdyonghu_id` tinyint(4) DEFAULT NULL COMMENT '发布人',
`initiate_time` timestamp NULL DEFAULT NULL COMMENT '发布时间 Search111',
`addresseename` varchar(200) DEFAULT NULL COMMENT '收件人名称',
`jdphone` varchar(200) DEFAULT NULL COMMENT '电话',
`jdaddressee` varchar(200) DEFAULT NULL COMMENT '地址',
`jdtakecode` varchar(200) DEFAULT NULL COMMENT '(取/寄)件码',
`jdzt_types` tinyint(4) DEFAULT NULL COMMENT '快递状态 Search111',
`kdlx_types` tinyint(4) DEFAULT NULL COMMENT '快递类型 Search111',
`dx` tinyint(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COMMENT='快递接单表';
/*Data for the table `jiedan` */
insert into `jiedan`(`id`,`odd`,`daiqukuaidimc`,`jdyonghu_id`,`initiate_time`,`addresseename`,`jdphone`,`jdaddressee`,`jdtakecode`,`jdzt_types`,`kdlx_types`,`dx`) values (10,'1615536950464','快递2',3,'2021-03-12 16:15:50','小王','17787788787','住宿楼栋603 寝室号603','6e185e',2,1,NULL),(11,'1615537130423','快递3',3,'2021-03-12 16:18:50','小站','222222222','住宿楼栋321 寝室号321','d070ea',2,2,1);
/*Table structure for table `token` */
DROP TABLE IF EXISTS `token`;
CREATE TABLE `token` (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`userid` int(20) NOT NULL COMMENT '用户id',
`username` varchar(100) NOT NULL COMMENT '用户名',
`tablename` varchar(100) DEFAULT NULL COMMENT '表名',
`role` varchar(100) DEFAULT NULL COMMENT '角色',
`token` varchar(200) NOT NULL COMMENT '密码',
`addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '新增时间',
`expiratedtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '过期时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='token表';
/*Data for the table `token` */
insert into `token`(`id`,`userid`,`username`,`tablename`,`role`,`token`,`addtime`,`expiratedtime`) values (5,1,'admin','users','管理员','jdbgo9w6arggzqdo3nrrcljj6q08joaq','2021-03-04 11:02:31','2021-03-12 18:07:43'),(6,100,'111','yonghu','代取人','1jdqizh1vsl6kemi3u19w37m284xgens','2021-03-12 11:03:12','2021-03-12 17:13:26'),(7,1,'111','yonghu','用户','l5eqdbtjj882smoz7d82w7d7g76cu4jc','2021-03-12 11:44:02','2021-03-12 18:09:21'),(8,2,'222','yonghu','用户','1kovxdqfjxyg9ebqf8393mq3dotv5kcd','2021-03-12 14:55:11','2021-03-12 18:09:31'),(9,101,'222','yonghu','代取人','7kslcc46et47qrge50u7oo1ev6brmaic','2021-03-12 15:59:47','2021-03-12 17:13:32'),(10,3,'333','yonghu','用户','j3ggt0jgqd8h8bdohporm11dv37ta5n0','2021-03-12 16:13:53','2021-03-12 17:14:26');
/*Table structure for table `users` */
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`username` varchar(100) NOT NULL COMMENT '用户名',
`password` varchar(100) NOT NULL COMMENT '密码',
`role` varchar(100) NOT NULL DEFAULT '管理员' COMMENT '角色',
`addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '新增时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用户表';
/*Data for the table `users` */
insert into `users`(`id`,`username`,`password`,`role`,`addtime`) values (1,'admin','admin','管理员','2021-03-01 00:00:00');
/*Table structure for table `yijiedan` */
DROP TABLE IF EXISTS `yijiedan`;
CREATE TABLE `yijiedan` (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`odd` varchar(200) DEFAULT NULL COMMENT '单号',
`yonghu_id` tinyint(4) DEFAULT NULL COMMENT '发布人',
`fbphone` varchar(200) DEFAULT NULL COMMENT '手机号',
`daiquren_id` tinyint(4) DEFAULT NULL COMMENT '接单人',
`jdphone` varchar(200) DEFAULT NULL COMMENT '手机号',
`initiate_time` timestamp NULL DEFAULT NULL COMMENT '接单时间 Search111',
`ddzt_types` tinyint(4) DEFAULT NULL COMMENT '订单状态 Search111',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='已接单表';
/*Data for the table `yijiedan` */
insert into `yijiedan`(`id`,`odd`,`yonghu_id`,`fbphone`,`daiquren_id`,`jdphone`,`initiate_time`,`ddzt_types`) values (7,'1615536950464',3,'17787788787',100,'11111','2021-03-12 16:16:41',2),(8,'1615537130423',3,'222222222',100,'11111','2021-03-12 16:19:00',2);
/*Table structure for table `yonghu` */
DROP TABLE IF EXISTS `yonghu`;
CREATE TABLE `yonghu` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`studentnumber` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '学号',
`name` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '用户名称 Search111',
`username` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '账号',
`password` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '密码',
`sex_types` tinyint(4) DEFAULT NULL COMMENT '性别 Search111',
`img_photo` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '头像',
`phone` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '联系电话',
`zhuSuLou` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '住宿楼栋',
`dormitory` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '寝室号',
`role` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '身份',
`yanzheng` int(255) DEFAULT '0' COMMENT '验证',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;
/*Data for the table `yonghu` */
insert into `yonghu`(`id`,`studentnumber`,`name`,`username`,`password`,`sex_types`,`img_photo`,`phone`,`zhuSuLou`,`dormitory`,`role`,`yanzheng`) values (1,'学号1','小札','111','111',1,'http://localhost:8080/kuaidizhan/file/download?fileName=1615469084435.jpg','111111111','123','321','用户',1),(2,'学号2','小站','222','222',2,'http://localhost:8080/kuaidizhan/file/download?fileName=1615469074773.jpg','222222222','123','321','用户',1),(3,'学号3','小王','333','333',2,'http://localhost:8080/kuaidizhan/file/download?fileName=1615536666445.jpg','17787788787','1栋6楼','603','用户',1),(5,'123','123','123','123',NULL,NULL,NULL,NULL,NULL,'用户',0),(6,'123','123','123','123',NULL,NULL,NULL,NULL,NULL,'用户',0);
/*Table structure for table `zhandian` */
DROP TABLE IF EXISTS `zhandian`;
CREATE TABLE `zhandian` (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`zdname` varchar(200) DEFAULT NULL COMMENT '站点名称 Search111',
`address` varchar(200) DEFAULT NULL COMMENT '站点地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='快递站点';
/*Data for the table `zhandian` */
insert into `zhandian`(`id`,`zdname`,`address`) values (1,'站点3','站点地址3'),(2,'站点2','站点地址2'),(3,'站点1','站点地址1'),(4,'站点4','站点地址4');
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

@ -1,296 +0,0 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jlwl</groupId>
<artifactId>kuaidizhan</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>5.0.0.RELEASE</spring.version>
<junit.version>4.12</junit.version>
<druid.version>1.1.0</druid.version>
<fastjson.version>1.2.8</fastjson.version>
<mybaitsplus.version>2.3</mybaitsplus.version>
<mysql.version>5.1.38</mysql.version>
<log4j.version>1.2.17</log4j.version>
<slf4j.version>1.7.19</slf4j.version>
<aspectjweaver.version>1.8.8</aspectjweaver.version>
<fileupload.version>1.3.1</fileupload.version>
<jstl.version>1.2</jstl.version>
</properties>
<dependencies>
<!-- JUnit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- Spring MVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- AOP -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectjweaver.version}</version>
</dependency>
<!-- FileUpload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${fileupload.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<!-- Mybatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>${mybaitsplus.version}</version>
</dependency>
<!-- Mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- Druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- FastJson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- Log -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.0.12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-core -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.29</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.8.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<!-- 百度人工智能 -->
<dependency>
<groupId>com.baidu.aip</groupId>
<artifactId>java-sdk</artifactId>
<version>4.4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-jasper -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>9.0.27</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
<!-- 导入导出excel -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.11-beta2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.11-beta2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.11-beta2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-excelant</artifactId>
<version>3.11-beta2</version>
</dependency>
</dependencies>
<build>
<!-- 项目访问名称 -->
<finalName>kuaidizhan</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

@ -1,88 +0,0 @@
package com.interceptor;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import com.annotation.IgnoreAuth;
import com.entity.EIException;
import com.entity.TokenEntity;
import com.service.TokenService;
import com.utils.R;
/**
* (Token)
*/
@Component
public class AuthorizationInterceptor implements HandlerInterceptor {
public static final String LOGIN_TOKEN_KEY = "Token";
@Autowired
private TokenService tokenService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//支持跨域请求
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization");
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
IgnoreAuth annotation;
if (handler instanceof HandlerMethod) {
annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
} else {
return true;
}
//从header中获取token
String token = request.getHeader(LOGIN_TOKEN_KEY);
/**
*
*/
if(annotation!=null) {
return true;
}
TokenEntity tokenEntity = null;
if(StringUtils.isNotBlank(token)) {
tokenEntity = tokenService.getTokenEntity(token);
}
if(tokenEntity != null) {
request.getSession().setAttribute("userId", tokenEntity.getUserid());
request.getSession().setAttribute("role", tokenEntity.getRole());
request.getSession().setAttribute("tableName", tokenEntity.getTablename());
request.getSession().setAttribute("username", tokenEntity.getUsername());
return true;
}
PrintWriter writer = null;
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
try {
writer = response.getWriter();
writer.print(JSONObject.toJSONString(R.error(401, "请先登录")));
} finally {
if(writer != null){
writer.close();
}
}
// throw new EIException("请先登录", 401);
return false;
}
}

@ -1,31 +0,0 @@
package com.model.enums;
import java.io.Serializable;
import com.baomidou.mybatisplus.enums.IEnum;
/**
* IEnum spring-mybatis.xml typeEnumsPackage
*/
public enum TypeEnum implements IEnum {
DISABLED(0, "禁用"),
NORMAL(1, "正常");
private final int value;
private final String desc;
TypeEnum(final int value, final String desc) {
this.value = value;
this.desc = desc;
}
@Override
public Serializable getValue() {
return this.value;
}
// Jackson 注解为 JsonValue 返回中文 json 描述
public String getDesc() {
return this.desc;
}
}

@ -1,49 +0,0 @@
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----

@ -1 +0,0 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDyM6W3ivT09WQsSmN//Y/XQjUze+GIBEhTRHQKiwpdYzp7UegkIFy1Z6R3R6kK4uAKeJXMLrYFIvn+Lj+KeBKSSXURGFT/eaSyglBGaXGYT7zA9upcjnK4fZVfSGF7NrDRjdMhYbYTOX+qrse7ys/SVl0OwCuhWKtK76IkQImtDS56qCPR/eOtDU1epPiOiCE+Q+x6S0wfG73r2bEybYKkKDftcmpWDV05lZUPtl2+IuO00arHCNk618jm57WshTYglKGRrQ94a2RbIjek0QnRnc7zaY+qMIa0ZaEZg06ePns+PWOnOB0HyuOySVTsmk5HxaxLjyoK4Jfmk/Sf/GlVqy5HTz+cYNSv1G8MeYIMgqJvld+Y1HGsLNQYfkT+OQGt1nkWlQ0wFmWDj887N7ajdorzC8a4EzHCLyY7ae/3eer4Gi7tnwjw3usSS6g7PLNEJ8fALFp7iTGoTbAc7DNEK4IXNnmVIWWXmpIJRAAxV/v7WQfkjCiAr68h7qXICeWndfo2KRl5IJh2wUgnJoLE0g1iN57gnv/AOZHeHEJbM3C6CyTWZdlRvJTmxKf3qlKxPuk5lCaq0JUheugBsijkvCctBktTt3eDTxk2vK+RsHhUq9hH6LK6gQpFkBpVcHhUp3XS3oPkH1ZT/3YF7k4Qg9WvZURSM2U5XstXQCLDkQ== 2548089586@qq.com

@ -1,49 +0,0 @@
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----

@ -1 +0,0 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDDM2XgmyystTOGqdrOTHyoAeDN1LQhAIA/TtB/rNjK1p8DcF53mMuhx+5oWQuISi4wPUOvNlc2NfzR2ZDdqQMmanL8TcCXfWKT1DNmtTmYNhKt68hDIByN5YGXISM+H9SzTVbILVB28PJou2alzpf+0d3LLxcvBqAakc7y41ESmUCG8a28wXlyLp29eZWTNS6JREfstNUe4bYW2WnaR/CZHlyLsqDwZZI5NrRcoSuM8qBvzYYOPd22/PyLYJsBWCnxnUCks45fUkn7SwwBTpZHAML36UFi2FQVA353CsTQS+JlFLmEa5QUnO0WQqw4/8ciWlp3RJVUVxIyFDFJfDNUpPDlp13w+RKj0yPALT8UuMjXQy1UR25FyLsF5f1pVAgHiYK+sehy9TKRV1EXyZFff9vTBwwEih+M0kQQVtNGj1jNSFLspLbTSV4NGKtVTbzVWmPHhfMbaKNHyFAwz5dtIgncW84tM+hPwaNJJpRg+EzqKpCqWjNFkLkMLyVZ8jka3Gkd8SvUPgwLCy+Lq6mAcdodTSu9NqCT3gUADIr0g8kD3NNDCCn4T0jn2X6Tx4B2XrWfY/Jwe6/1xDYQSJk7TZaveujqw+hXTdFj/kP/8nW3OYe5Cx4UGT+XwPE2cW3W/8JG9hF7LQgiPvBok8fwswNnPjPWxojDRhNrBMEEIw== 2548089586@qq.com

@ -1,10 +0,0 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# 依赖于环境的 Maven 主目录路径
/mavenHomeManager.xml
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_23" default="true" project-jdk-name="23" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/main.iml" filepath="$PROJECT_DIR$/main.iml" />
</modules>
</component>
</project>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../../.." vcs="Git" />
</component>
</project>

@ -0,0 +1,86 @@
package com.ServletContextListener;
// 导入MyBatis-Plus的EntityWrapper类用于构建实体查询条件
import com.baomidou.mybatisplus.mapper.EntityWrapper;
// 导入字典实体类,用于表示字典表中的数据
import com.entity.DictionaryEntity;
// 导入字典服务接口,用于操作字典数据
import com.service.DictionaryService;
// 导入日志记录器接口
import org.slf4j.Logger;
// 导入日志记录器工厂类,用于创建日志记录器
import org.slf4j.LoggerFactory;
// 导入Spring的应用上下文接口代表Spring应用的上下文环境
import org.springframework.context.ApplicationContext;
// 导入Spring的Web应用上下文工具类用于从Servlet上下文获取Spring应用上下文
import org.springframework.web.context.support.WebApplicationContextUtils;
// 导入Servlet上下文监听器接口
import javax.servlet.ServletContextListener;
// 导入Servlet上下文事件类代表Servlet上下文的事件
import javax.servlet.ServletContextEvent;
// 导入HashMap类用于存储键值对
import java.util.HashMap;
// 导入List接口用于存储有序集合
import java.util.List;
// 导入Map接口用于存储键值对映射
import java.util.Map;
/**
* ,,
*/
public class DictionaryServletContextListener implements ServletContextListener {
// 创建一个静态的日志记录器,用于记录该类的日志信息
private static final Logger logger = LoggerFactory.getLogger(DictionaryServletContextListener.class);
// 这里注释掉的@Autowired和DictionaryServiceImpl的声明原本是想自动注入字典服务实现类但可能因为在ServletContextListener中不能直接使用@Autowired所以采用其他方式获取服务
// @Autowired
// private DictionaryServiceImpl dictionaryService;
/**
* Servlet
* @param sce ServletServlet
*/
@Override
public void contextDestroyed(ServletContextEvent sce) {
// 记录服务器停止的日志信息
logger.info("----------服务器停止----------");
}
/**
* Servlet
* @param sce ServletServlet
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
// 从Servlet上下文获取Spring的应用上下文
ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());
// 记录字典表初始化开始的日志信息
logger.info("----------字典表初始化开始----------");
// 从Spring应用上下文中获取字典服务实例
DictionaryService dictionaryService = (DictionaryService)appContext.getBean("dictionaryService");
// 使用字典服务查询所有的字典实体数据
List<DictionaryEntity> dictionaryEntities = dictionaryService.selectList(new EntityWrapper<DictionaryEntity>());
// 创建一个嵌套的Map用于存储字典数据外层键为字典代码内层键为代码索引值为索引名称
Map<String, Map<Integer,String>> map = new HashMap<>();
// 遍历查询到的所有字典实体数据
for(DictionaryEntity d :dictionaryEntities){
// 根据字典代码从外层Map中获取内层Map
Map<Integer, String> m = map.get(d.getDicCode());
// 如果内层Map为空或者不存在则创建一个新的内层Map
if(m ==null || m.isEmpty()){
m = new HashMap<>();
}
// 将代码索引和索引名称存入内层Map
m.put(d.getCodeIndex(),d.getIndexName());
// 将内层Map存入外层Map键为字典代码
map.put(d.getDicCode(),m);
}
// 将处理好的字典数据存储到Servlet上下文中键为"dictionaryMap"
sce.getServletContext().setAttribute("dictionaryMap", map);
// 记录字典表初始化完成的日志信息
logger.info("----------字典表初始化完成----------");
}
}

@ -1,60 +0,0 @@
package com.controller;
import java.io.*;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
@WebServlet("/download")
public class AntiLeechServlet extends HttpServlet {
// 允许访问的域名白名单(根据实际修改)
private static final String[] ALLOWED_DOMAINS = {
"http://your-domain.com",
"https://www.your-domain.com"
};
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 获取来源域名
String referer = request.getHeader("Referer");
// 防盗链检查
if (referer == null || !isAllowedDomain(referer)) {
response.sendError(HttpServletResponse.SC_FORBIDDEN, "禁止直接访问");
return;
}
// 文件路径配置(根据实际路径修改)
String filePath = getServletContext().getRealPath("/WEB-INF/resources/images/image.png");
File file = new File(filePath);
// 检查文件是否存在
if (!file.exists()) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
// 设置响应头
response.setContentType("image/png");
response.setHeader("Content-Disposition", "attachment; filename=\"image.png\"");
response.setContentLength((int) file.length());
// 文件传输
try (InputStream in = new FileInputStream(file);
OutputStream out = response.getOutputStream()) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
}
}
// 域名白名单验证方法
private boolean isAllowedDomain(String referer) {
if (referer == null) return false;
for (String domain : ALLOWED_DOMAINS) {
if (referer.startsWith(domain)) {
return true;
}
}
return false;
}
}

@ -33,318 +33,208 @@ import com.service.ConfigService;
import com.utils.BaiduUtil;
import com.utils.FileUtil;
import com.utils.R;
/**
*
*
*
*
* - CommonService
* - ConfigService
*
*
* 1.
* 2.
* 3.
*
*/
@RestController
public class CommonController {
public class CommonController{
@Autowired
private CommonService commonService; // 通用业务逻辑服务
private CommonService commonService;
@Autowired
private ConfigService configService; // 配置管理服务
private static AipFace client = null; // 百度人脸识别客户端(单例模式)
private static String BAIDU_DITU_AK = null; // 百度地图AK从配置中心获取
/**
*
* API
*
* @param lng 116.404
* @param lat 39.915
* @return {"status":0,"result":{"city":"北京市"}}
*
* @throws baidu_ditu_ak
*/
private ConfigService configService;
private static AipFace client = null;
private static String BAIDU_DITU_AK = null;
@RequestMapping("/location")
public R location(String lng, String lat) {
// 懒加载配置(首次调用时从数据库加载配置)
if (BAIDU_DITU_AK == null) {
ConfigEntity config = configService.selectOne(
new EntityWrapper<ConfigEntity>().eq("name", "baidu_ditu_ak")
);
BAIDU_DITU_AK = config.getValue();
if (StringUtils.isEmpty(BAIDU_DITU_AK)) {
public R location(String lng,String lat) {
if(BAIDU_DITU_AK==null) {
BAIDU_DITU_AK = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "baidu_ditu_ak")).getValue();
if(BAIDU_DITU_AK==null) {
return R.error("请在配置管理中正确配置baidu_ditu_ak");
}
}
// 调用百度地图逆地理编码API
Map<String, String> map = BaiduUtil.getCityByLonLat(BAIDU_DITU_AK, lng, lat);
return R.ok().put("data", map);
}
/**
* 1:1
* 使AI
*
* @param face1 1upload
* @param face2 2
* @param request HTTP
* @return {"score":85.5}
*
* @throws APIKey/SecretKey
* @throws
*
*
* @param face1 1
* @param face2 2
* @return
*/
@RequestMapping("/matchFace")
public R matchFace(String face1, String face2, HttpServletRequest request) {
// 初始化百度AI客户端单例模式保证线程安全
if (client == null) {
String APIKey = configService.selectOne(
new EntityWrapper<ConfigEntity>().eq("name", "APIKey")
).getValue();
String SecretKey = configService.selectOne(
new EntityWrapper<ConfigEntity>().eq("name", "SecretKey")
).getValue();
if(client==null) {
/*String AppID = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "AppID")).getValue();*/
String APIKey = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "APIKey")).getValue();
String SecretKey = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "SecretKey")).getValue();
String token = BaiduUtil.getAuth(APIKey, SecretKey);
if (token == null) {
if(token==null) {
return R.error("请在配置管理中正确配置APIKey和SecretKey");
}
client = new AipFace(null, APIKey, SecretKey);
client.setConnectionTimeoutInMillis(2000); // 连接超时2秒
client.setSocketTimeoutInMillis(60000); // 数据传输超时60秒
client.setConnectionTimeoutInMillis(2000);
client.setSocketTimeoutInMillis(60000);
}
JSONObject res = null;
try {
// 构建服务器文件路径从web应用根目录获取
String uploadPath = request.getSession()
.getServletContext()
.getRealPath("/upload");
File file1 = new File(uploadPath, face1);
File file2 = new File(uploadPath, face2);
// 图片转Base64编码
File file1 = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+face1);
File file2 = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+face2);
String img1 = Base64Util.encode(FileUtil.FileToByte(file1));
String img2 = Base64Util.encode(FileUtil.FileToByte(file2));
// 构造比对请求参数
MatchRequest req1 = new MatchRequest(img1, "BASE64");
MatchRequest req2 = new MatchRequest(img2, "BASE64");
ArrayList<MatchRequest> requests = new ArrayList<>();
ArrayList<MatchRequest> requests = new ArrayList<MatchRequest>();
requests.add(req1);
requests.add(req2);
// 执行人脸比对
JSONObject res = client.match(requests);
return R.ok().put("data",
JSONObject.parse(res.get("result").toString())
);
res = client.match(requests);
System.out.println(res.get("result"));
} catch (FileNotFoundException e) {
return R.error("文件不存在:" + e.getMessage());
e.printStackTrace();
return R.error("文件不存在");
} catch (IOException e) {
return R.error("文件处理失败:" + e.getMessage());
}
e.printStackTrace();
}
return R.ok().put("data", com.alibaba.fastjson.JSONObject.parse(res.get("result").toString()));
}
/**
*
*
*
* @param tableName sys_area
* @param columnName parent_id ID
* @param level
* @param parent ID
* @return ["选项1","选项2"]
*
* @apiNote /option/sys_area/area_name?level=2&parent=110000
* tablecolumn()
* @param table
* @param column
* @return
*/
@RequestMapping("/option/{tableName}/{columnName}")
@IgnoreAuth // 标注不需要登录验证
public R getOption(@PathVariable String tableName,
@PathVariable String columnName,
@RequestParam(required = false) String level,
@RequestParam(required = false) String parent) {
Map<String, Object> params = new HashMap<>();
@IgnoreAuth
public R getOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName,String level,String parent) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("table", tableName);
params.put("column", columnName);
// 添加可选参数
if (StringUtils.isNotBlank(level)) {
if(StringUtils.isNotBlank(level)) {
params.put("level", level);
}
if (StringUtils.isNotBlank(parent)) {
if(StringUtils.isNotBlank(parent)) {
params.put("parent", parent);
}
List<String> data = commonService.getOption(params);
return R.ok().put("data", data);
}
}
/**
* tablecolumn
* @param table
* @param column
* @return
*/
/**
*
*
*
* @param tableName sys_user
* @param columnName dept_id ID
* @param columnValue 1001
* @return {"id":1,"name":"测试数据"}
*
* @apiNote /follow/sys_user/dept_id/1001
*/
@RequestMapping("/follow/{tableName}/{columnName}")
@IgnoreAuth
public R getFollowByOption(@PathVariable String tableName,
@PathVariable String columnName,
@RequestParam String columnValue) {
Map<String, Object> params = new HashMap<>();
params.put("table", tableName);
params.put("column", columnName);
params.put("columnValue", columnValue); // 关键查询条件
Map<String, Object> result = commonService.getFollowByOption(params);
return R.ok().put("data", result);
}
/**
*
* sh
*
* @param tableName news
* @param map id-ID, shzt-
* @return
*
* @apiNote
* POST /sh/news
* Body: {"id":123,"shzt":"1"}
*/
@RequestMapping("/sh/{tableName}")
public R sh(@PathVariable String tableName,
@RequestBody Map<String, Object> map) {
map.put("table", tableName); // 注入表名参数
commonService.sh(map); // 调用通用审核服务
return R.ok();
}
/**
*
*
*
* @param tableName order
* @param columnName create_time
* @param type 1: 2:
* @param map
* - remindstart:
* - remindend:
* @return {"count":5}
*
* @apiNote
* +remindstart +remindend
*/
@RequestMapping("/remind/{tableName}/{columnName}/{type}")
@IgnoreAuth
public R remindCount(@PathVariable String tableName,
@PathVariable String columnName,
@PathVariable String type,
@RequestParam Map<String, Object> map) {
map.put("table", tableName);
map.put("column", columnName);
map.put("type", type);
// 日期类型特殊处理
if ("2".equals(type)) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
// 处理开始日期偏移(支持负数表示过去天数)
if (map.get("remindstart") != null) {
int offset = Integer.parseInt(map.get("remindstart").toString());
c.add(Calendar.DAY_OF_MONTH, offset);
map.put("remindstart", sdf.format(c.getTime()));
}
// 处理结束日期偏移
if (map.get("remindend") != null) {
int offset = Integer.parseInt(map.get("remindend").toString());
c.add(Calendar.DAY_OF_MONTH, offset);
map.put("remindend", sdf.format(c.getTime()));
@RequestMapping("/follow/{tableName}/{columnName}")
@IgnoreAuth
public R getFollowByOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName, @RequestParam String columnValue) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("table", tableName);
params.put("column", columnName);
params.put("columnValue", columnValue);
Map<String, Object> result = commonService.getFollowByOption(params);
return R.ok().put("data", result);
}
/**
* tablesfsh
* @param table
* @param map
* @return
*/
@RequestMapping("/sh/{tableName}")
public R sh(@PathVariable("tableName") String tableName, @RequestBody Map<String, Object> map) {
map.put("table", tableName);
commonService.sh(map);
return R.ok();
}
/**
*
* @param tableName
* @param columnName
* @param type 1: 2:
* @param map
* @return
*/
@RequestMapping("/remind/{tableName}/{columnName}/{type}")
@IgnoreAuth
public R remindCount(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName,
@PathVariable("type") String type,@RequestParam Map<String, Object> map) {
map.put("table", tableName);
map.put("column", columnName);
map.put("type", type);
if(type.equals("2")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
Date remindStartDate = null;
Date remindEndDate = null;
if(map.get("remindstart")!=null) {
Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindStart);
remindStartDate = c.getTime();
map.put("remindstart", sdf.format(remindStartDate));
}
if(map.get("remindend")!=null) {
Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindEnd);
remindEndDate = c.getTime();
map.put("remindend", sdf.format(remindEndDate));
}
}
int count = commonService.remindCount(map);
return R.ok().put("count", count);
}
int count = commonService.remindCount(map);
return R.ok().put("count", count);
}
/**
*
*
*
* @param tableName finance
* @param columnName amount
* @return {"sum":1000.5}
*/
@RequestMapping("/cal/{tableName}/{columnName}")
@IgnoreAuth
public R cal(@PathVariable String tableName,
@PathVariable String columnName) {
Map<String, Object> params = new HashMap<>();
params.put("table", tableName);
params.put("column", columnName);
Map<String, Object> result = commonService.selectCal(params);
return R.ok().put("data", result);
}
/**
*
* GROUP BY
*
* @param tableName sales
* @param columnName product_type
* @return [{"group":"类型A","count":10},...]
*/
@RequestMapping("/group/{tableName}/{columnName}")
@IgnoreAuth
public R group(@PathVariable String tableName,
@PathVariable String columnName) {
Map<String, Object> params = new HashMap<>();
params.put("table", tableName);
params.put("column", columnName);
List<Map<String, Object>> result = commonService.selectGroup(params);
return R.ok().put("data", result);
}
/**
*
* X/Y
*
* @param tableName visit_log 访
* @param xColumnName Xdate
* @param yColumnName Ychannel
* @return [{"x":"2023-01-01","y":"SEO","count":15},...]
*/
@RequestMapping("/value/{tableName}/{xColumnName}/{yColumnName}")
@IgnoreAuth
public R value(@PathVariable String tableName,
@PathVariable String yColumnName,
@PathVariable String xColumnName) {
Map<String, Object> params = new HashMap<>();
params.put("table", tableName);
params.put("xColumn", xColumnName);
params.put("yColumn", yColumnName);
List<Map<String, Object>> result = commonService.selectValue(params);
return R.ok().put("data", result);
/**
*
*/
@RequestMapping("/cal/{tableName}/{columnName}")
@IgnoreAuth
public R cal(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("table", tableName);
params.put("column", columnName);
Map<String, Object> result = commonService.selectCal(params);
return R.ok().put("data", result);
}
/**
*
*/
@RequestMapping("/group/{tableName}/{columnName}")
@IgnoreAuth
public R group(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("table", tableName);
params.put("column", columnName);
List<Map<String, Object>> result = commonService.selectGroup(params);
return R.ok().put("data", result);
}
/**
*
*/
@RequestMapping("/value/{tableName}/{xColumnName}/{yColumnName}")
@IgnoreAuth
public R value(@PathVariable("tableName") String tableName, @PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("table", tableName);
params.put("xColumn", xColumnName);
params.put("yColumn", yColumnName);
List<Map<String, Object>> result = commonService.selectValue(params);
return R.ok().put("data", result);
}
}

@ -1,164 +0,0 @@
import java.util.*;
// 快递实体类POJO
class ExpressItem {
private String trackingNumber; // 运单号
private String recipient; // 收件人
private String phone; // 联系电话
private String status; // 包裹状态
private Date arrivalTime; // 到站时间
private String pickupCode; // 取件码
public ExpressItem(String trackingNumber, String recipient, String phone) {
this.trackingNumber = trackingNumber;
this.recipient = recipient;
this.phone = phone;
this.status = "待取件"; // 默认状态
this.arrivalTime = new Date();
this.pickupCode = generatePickupCode(); // 自动生成取件码
}
// 生成4位随机取件码0000-9999
private String generatePickupCode() {
Random random = new Random();
return String.format("%04d", random.nextInt(10000));
}
// Getter/Setter 区域省略其他getter/setter
public String getStatus() { return status; }
public String getPickupCode() { return pickupCode; }
// ...其他getter/setter保持原有结构
@Override
public String toString() {
return String.format("""
%s
%s
%s
%s
%tF %tT
""", trackingNumber, recipient, status, pickupCode, arrivalTime, arrivalTime);
}
}
// 快递业务逻辑类
class ExpressService {
private final Map<String, ExpressItem> database = new HashMap<>(); // 内存数据库
private int totalPackages = 0; // 总入库计数器
// 快递入库(返回是否成功)
public boolean addPackage(ExpressItem item) {
if (database.containsKey(item.getTrackingNumber())) return false; // 重复检查
database.put(item.getTrackingNumber(), item);
totalPackages++;
return true;
}
// 标记包裹为已取件
public boolean markAsPickedUp(String trackingNumber) {
ExpressItem item = database.get(trackingNumber);
if (item != null && "待取件".equals(item.getStatus())) { // 双重验证
item.setStatus("已取件");
return true;
}
return false;
}
// 统计方法
public int getTotalPackages() { return totalPackages; }
public int getPendingPackages() {
return (int) database.values().stream() // 使用流式计算
.filter(item -> "待取件".equals(item.getStatus()))
.count();
}
}
// 控制台交互层
public class ExpressManagementSystem {
private static final Scanner scanner = new Scanner(System.in);
private static final ExpressService service = new ExpressService();
public static void main(String[] args) {
while (true) {
printMenu();
int choice = getIntInput("请选择操作:");
switch (choice) {
case 1 -> addPackage();
case 2 -> pickupPackage();
case 3 -> searchPackage();
case 4 -> showStatistics();
case 5 -> System.exit(0);
default -> System.out.println("无效输入!");
}
}
}
private static void printMenu() {
System.out.println("""
===== =====
1.
2.
3.
4.
5. 退
""");
}
private static void addPackage() {
System.out.println("\n--- 快递入库 ---");
String trackingNumber = getNonEmptyInput("请输入运单号:");
String recipient = getNonEmptyInput("请输入收件人姓名:");
String phone = getValidPhone();
ExpressItem newItem = new ExpressItem(trackingNumber, recipient, phone);
System.out.println(service.addPackage(newItem)
? "入库成功!\n取件码" + newItem.getPickupCode()
: "该运单号已存在!");
}
private static void pickupPackage() {
System.out.println("\n--- 快递出库 ---");
String trackingNumber = getNonEmptyInput("请输入运单号:");
String inputCode = getNonEmptyInput("请输入取件码:");
ExpressItem item = service.getPackage(trackingNumber);
if (item == null) {
System.out.println("运单号不存在!");
return;
}
System.out.println(inputCode.equals(item.getPickupCode())
? service.markAsPickedUp(trackingNumber)
? "取件成功!"
: "该包裹已取件!"
: "取件码错误!");
}
// 辅助方法区域
private static String getNonEmptyInput(String prompt) {
while (true) {
String input = scanner.nextLine().trim();
if (!input.isEmpty()) return input;
System.out.print("输入不能为空,请重新输入:");
}
}
private static String getValidPhone() {
while (true) {
String phone = scanner.nextLine().trim();
if (phone.matches("1[3-9]\\d{9}")) return phone; // 中国手机号正则
System.out.print("手机号格式不正确,请重新输入:");
}
}
private static int getIntInput(String prompt) {
while (true) {
try {
return Integer.parseInt(scanner.nextLine().trim());
} catch (NumberFormatException e) {
System.out.print("请输入有效数字:");
}
}
}
}

@ -1,261 +0,0 @@
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
import com.google.gson.Gson; // 需要gson库支持添加依赖
/**
*
*
*/
class ExpressIteml {
// ... [原有属性保持不变]
private double weight; // 包裹重量(kg)
private Dimension dimension; // 包裹尺寸(cm)
private int storageDays; // 存放天数
public ExpressItem(String trackingNumber, String recipient, String phone,
double weight, int length, int width, int height) {
// ... [原有初始化代码]
this.weight = weight;
this.dimension = new Dimension(length, width, height);
this.storageDays = 0;
}
// 新增内部类:包裹尺寸
static class Dimension {
int length;
int width;
int height;
Dimension(int l, int w, int h) {
this.length = l;
this.width = w;
this.height = h;
}
@Override
public String toString() {
return String.format("%dx%dx%d cm", length, width, height);
}
}
// 新增业务方法:计算体积重量(航空件常用算法)
public double calculateVolumetricWeight() {
// 体积重量(kg) = 长(cm)*宽(cm)*高(cm)/6000
return (dimension.length * dimension.width * dimension.height) / 6000.0;
}
// Getter/Setter 区域(新增属性)
public double getWeight() { return weight; }
public Dimension getDimension() { return dimension; }
public int getStorageDays() { return storageDays; }
public void setStorageDays(int days) { this.storageDays = days; }
}
/**
*
*
*/
class ExpressService {
// ... [原有属性保持不变]
private final DataPersistence persistence = new DataPersistence();
private static final int MAX_STORAGE_DAYS = 7; // 最大免费存放天数
public ExpressService() {
// 启动时加载持久化数据
database = persistence.loadData();
// 更新所有包裹的存放天数(模拟每日自动更新)
updateStorageDays();
}
// 新增方法:更新所有包裹的存放天数
private void updateStorageDays() {
long today = new Date().getTime() / (24 * 3600 * 1000);
database.values().forEach(item -> {
long arrivalDay = item.getArrivalTime().getTime() / (24 * 3600 * 1000);
item.setStorageDays((int) (today - arrivalDay));
});
}
// 新增方法:获取超时包裹列表
public List<ExpressItem> getOverduePackages() {
return database.values().stream()
.filter(item -> item.getStorageDays() > MAX_STORAGE_DAYS)
.collect(Collectors.toList());
}
// 新增方法:按体积重量排序查询
public List<ExpressItem> searchByVolumetricWeight(double min, double max) {
return database.values().stream()
.filter(item -> {
double volWeight = item.calculateVolumetricWeight();
return volWeight >= min && volWeight <= max;
})
.sorted(Comparator.comparingDouble(ExpressItem::calculateVolumetricWeight).reversed())
.collect(Collectors.toList());
}
// 新增方法:批量标记为已取件
public int batchMarkAsPickedUp(List<String> trackingNumbers) {
return (int) trackingNumbers.stream()
.filter(tn -> {
ExpressItem item = database.get(tn);
return item != null && "待取件".equals(item.getStatus());
})
.peek(tn -> database.get(tn).setStatus("已取件"))
.count();
}
// 新增方法:获取仓库使用率统计
public Map<String, Double> getStorageUsage() {
Map<String, Double> usage = new HashMap<>();
long totalVolume = database.values().stream()
.mapToLong(item ->
item.getDimension().length *
item.getDimension().width *
item.getDimension().height
).sum();
usage.put("totalVolume", (double) totalVolume);
usage.put("averageVolume", totalVolume / (double) database.size());
return usage;
}
// 新增方法:数据持久化
public void saveData() {
persistence.saveData(database);
}
}
/**
*
* 使JSON
*/
class DataPersistence {
private static final String DATA_FILE = "express_data.json";
private final Gson gson = new Gson();
public Map<String, ExpressItem> loadData() {
try (Reader reader = new FileReader(DATA_FILE)) {
Type type = new com.google.gson.reflect.TypeToken<Map<String, ExpressItem>>() {}.getType();
return gson.fromJson(reader, type);
} catch (FileNotFoundException e) {
return new HashMap<>(); // 首次运行无数据文件
} catch (Exception e) {
System.err.println("数据加载错误: " + e.getMessage());
return new HashMap<>();
}
}
public void saveData(Map<String, ExpressItem> data) {
try (Writer writer = new FileWriter(DATA_FILE)) {
gson.toJson(data, writer);
} catch (Exception e) {
System.err.println("数据保存错误: " + e.getMessage());
}
}
}
/**
*
*
*/
public class ExpressManagementSystem {
// ... [原有属性保持不变]
private static final ExpressService service = new ExpressService();
private static void printAdvancedMenu() {
System.out.println("""
===== =====
6.
7.
8.
9. 使
10. 退
""");
}
private static void batchPickup() {
System.out.println("\n--- 批量取件 ---");
List<String> trackingNumbers = new ArrayList<>();
while (true) {
String tn = getNonEmptyInput("输入运单号输入0结束");
if ("0".equals(tn)) break;
trackingNumbers.add(tn);
}
int successCount = service.batchMarkAsPickedUp(trackingNumbers);
System.out.printf("成功取件%d个包裹\n", successCount);
}
private static void showOverduePackages() {
System.out.println("\n--- 超时包裹列表 ---");
List<ExpressItem> overdue = service.getOverduePackages();
if (overdue.isEmpty()) {
System.out.println("当前没有超时包裹");
return;
}
overdue.forEach(item ->
System.out.printf("运单号:%s 超时%d天\n",
item.getTrackingNumber(),
item.getStorageDays() - ExpressService.MAX_STORAGE_DAYS));
}
private static void volumetricSearch() {
System.out.println("\n--- 体积重量查询 ---");
double min = getDoubleInput("最小体积重量(kg)");
double max = getDoubleInput("最大体积重量(kg)");
List<ExpressItem> results = service.searchByVolumetricWeight(min, max);
if (results.isEmpty()) {
System.out.println("未找到匹配包裹");
return;
}
results.forEach(item ->
System.out.printf("运单号:%s 体积重量:%.2fkg\n",
item.getTrackingNumber(),
item.calculateVolumetricWeight()));
}
private static void showStorageStats() {
System.out.println("\n--- 仓库使用统计 ---");
Map<String, Double> stats = service.getStorageUsage();
System.out.printf("总占用体积:%,d cm³\n", stats.get("totalVolume").intValue());
System.out.printf("平均单件体积:%,.1f cm³\n", stats.get("averageVolume"));
}
public static void main(String[] args) {
while (true) {
printMenu();
int choice = getIntInput("请选择操作:");
switch (choice) {
case 1 -> addPackage();
case 2 -> pickupPackage();
case 3 -> searchPackage();
case 4 -> showStatistics();
case 5 -> printAdvancedMenu();
case 6 -> batchPickup();
case 7 -> showOverduePackages();
case 8 -> volumetricSearch();
case 9 -> showStorageStats();
case 10 -> {
service.saveData();
System.exit(0);
}
default -> System.out.println("无效输入!");
}
}
}
// 新增方法获取double类型输入
private static double getDoubleInput(String prompt) {
while (true) {
try {
return Double.parseDouble(scanner.nextLine().trim());
} catch (NumberFormatException e) {
System.out.print("请输入有效数字:");
}
}
}
}

@ -1,13 +0,0 @@
package com.controller;
import java.lang.annotation.*;
/**
* Token
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IgnoreAuth {
}

@ -1,235 +0,0 @@
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
*
*
*/
public class OverduePackageService {
// 配置参数(可通过配置文件加载)
private static final int MAX_FREE_DAYS = 7; // 最大免费存放天数
private static final double DAILY_STORAGE_FEE = 1.0; // 每日滞留费用(元)
private static final int NOTICE_INTERVAL = 3; // 提醒间隔天数
// 依赖服务注入
private final ExpressService expressService;
private final NotificationService notificationService;
// 内部状态管理
private final Map<String, OverdueRecord> overdueRecords = new HashMap<>();
private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
/**
*
*/
public OverduePackageService(ExpressService expressService,
NotificationService notificationService) {
this.expressService = expressService;
this.notificationService = notificationService;
initializeOverdueMonitoring();
}
/**
* 线
*/
private void initializeOverdueMonitoring() {
// 创建定时任务每24小时执行一次检测
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
detectAndProcessOverduePackages();
}
}, 0, 24 * 60 * 60 * 1000);
}
/**
*
*/
public synchronized void detectAndProcessOverduePackages() {
// 1. 获取所有待取件包裹
List<ExpressItem> allPackages = expressService.getAllPackages()
.stream()
.filter(item -> "待取件".equals(item.getStatus()))
.collect(Collectors.toList());
// 2. 计算存放天数并识别滞留件
List<ExpressItem> overduePackages = new ArrayList<>();
for (ExpressItem item : allPackages) {
int storageDays = calculateStorageDays(item.getArrivalTime());
item.setStorageDays(storageDays);
if (storageDays > MAX_FREE_DAYS) {
overduePackages.add(item);
recordOverdueHistory(item, storageDays);
}
}
// 3. 执行滞留处理流程
overduePackages.forEach(this::processOverduePackage);
}
/**
*
*/
private int calculateStorageDays(Date arrivalTime) {
long now = System.currentTimeMillis();
long elapsed = now - arrivalTime.getTime();
return (int) (elapsed / (24 * 3600 * 1000));
}
/**
*
*/
private void recordOverdueHistory(ExpressItem item, int currentDays) {
String trackingNumber = item.getTrackingNumber();
overdueRecords.putIfAbsent(trackingNumber, new OverdueRecord());
OverdueRecord record = overdueRecords.get(trackingNumber);
if (record.getLastNoticeDay() == 0 ||
(currentDays - record.getLastNoticeDay()) >= NOTICE_INTERVAL) {
record.setLastNoticeDay(currentDays);
record.incrementNoticeCount();
}
}
/**
*
*/
private void processOverduePackage(ExpressItem item) {
// 1. 费用计算
double overdueFee = calculateOverdueFee(item.getStorageDays());
// 2. 生成通知内容
String noticeContent = buildNoticeContent(item, overdueFee);
// 3. 发送通知(支持多通道)
sendMultiChannelNotice(item.getPhone(), noticeContent);
// 4. 标记为滞留状态(可选扩展)
if (item.getStorageDays() > MAX_FREE_DAYS * 2) {
expressService.markAsOverdue(item.getTrackingNumber());
}
}
/**
* 线
*/
private double calculateOverdueFee(int storageDays) {
int overdueDays = storageDays - MAX_FREE_DAYS;
return overdueDays > 0 ? overdueDays * DAILY_STORAGE_FEE : 0;
}
/**
*
*/
private String buildNoticeContent(ExpressItem item, double fee) {
return String.format("""
%s
%s
%d
%.2f
""",
item.getTrackingNumber(),
item.getRecipient(),
item.getStorageDays(),
fee);
}
/**
* ++
*/
private void sendMultiChannelNotice(String phone, String content) {
// 短信通知
notificationService.sendSMS(phone, content);
// 邮件通知(需实现邮件服务)
// notificationService.sendEmail(recipientEmail, "快递滞留提醒", content);
// 系统内消息(需集成消息中心)
// messageCenter.pushSystemNotice(userId, content);
}
/**
*
*/
public String generateOverdueReport() {
Map<Integer, Long> dailyCount = overdueRecords.values().stream()
.collect(Collectors.groupingBy(
OverdueRecord::getNoticeCount,
Collectors.counting()
));
StringBuilder report = new StringBuilder();
report.append("===== 滞留件统计报表 =====\n");
report.append("统计时间:").append(dateFormat.format(new Date())).append("\n");
report.append("-------------------------\n");
report.append("总滞留包裹数:").append(overdueRecords.size()).append("\n");
dailyCount.forEach((times, count) ->
report.append(String.format("被提醒%d次包裹数%d\n", times, count)));
return report.toString();
}
/**
*
*/
private static class OverdueRecord {
private int lastNoticeDay; // 最后一次通知时的存放天数
private int noticeCount; // 通知发送次数
// Getter/Setter
public int getLastNoticeDay() { return lastNoticeDay; }
public void setLastNoticeDay(int day) { this.lastNoticeDay = day; }
public int getNoticeCount() { return noticeCount; }
public void incrementNoticeCount() { this.noticeCount++; }
}
/**
*
*/
public interface NotificationService {
void sendSMS(String phone, String message);
// void sendEmail(String to, String subject, String content);
}
/**
*
*/
public List<ExpressItem> queryOverduePackages(int minDays, int maxDays) {
return expressService.getAllPackages().stream()
.filter(item -> {
int days = item.getStorageDays();
return days >= minDays && days <= maxDays;
})
.sorted(Comparator.comparingInt(ExpressItem::getStorageDays).reversed())
.collect(Collectors.toList());
}
/**
* 退
*/
public int batchReturnOverduePackages(int maxDays) {
List<ExpressItem> toReturn = queryOverduePackages(maxDays, Integer.MAX_VALUE);
toReturn.forEach(item -> expressService.markAsReturned(item.getTrackingNumber()));
return toReturn.size();
}
/**
*
*/
public Map<String, Double> getOverdueFees(String trackingNumber) {
OverdueRecord record = overdueRecords.get(trackingNumber);
if (record == null) return Collections.emptyMap();
Map<String, Double> feeDetail = new HashMap<>();
feeDetail.put("baseFee", (double) (record.getNoticeCount() * NOTICE_INTERVAL));
feeDetail.put("totalFee", calculateOverdueFee(record.getNoticeCount() * NOTICE_INTERVAL));
return feeDetail;
}
}

@ -1,301 +0,0 @@
import java.security.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.stream.Collectors;
/**
*
* //
*/
public class PickupCodeService {
// 配置参数(建议通过配置中心动态加载)
private static final int CODE_LENGTH = 6; // 取件码长度
private static final int MAX_ATTEMPTS = 3; // 最大尝试次数
private static final long EXPIRATION_TIME = 24 * 3600; // 有效期(秒)
private static final int CLEANUP_INTERVAL = 60 * 60; // 清理线程间隔(秒)
// 依赖服务注入
private final ExpressService expressService;
private final SecureRandom secureRandom;
private final ScheduledExecutorService cleanupScheduler;
// 核心数据存储内存数据库实际应使用Redis等持久化存储
private final Map<String, PickupCodeRecord> codeDatabase = new ConcurrentHashMap<>();
private final Map<String, Integer> attemptCounter = new ConcurrentHashMap<>();
/**
*
*/
public PickupCodeService(ExpressService expressService) {
this.expressService = expressService;
this.secureRandom = new SecureRandom();
this.cleanupScheduler = Executors.newSingleThreadScheduledExecutor();
initializeCleanupTask();
}
/**
*
*/
private void initializeCleanupTask() {
cleanupScheduler.scheduleAtFixedRate(() -> {
long now = System.currentTimeMillis();
codeDatabase.entrySet().removeIf(entry ->
entry.getValue().getExpirationTime() < now);
}, CLEANUP_INTERVAL, CLEANUP_INTERVAL, TimeUnit.SECONDS);
}
/**
*
* @param trackingNumber
* @return
* @throws CodeGenerationException
*/
public PickupCode generatePickupCode(String trackingNumber)
throws CodeGenerationException {
// 1. 参数验证
if (!expressService.packageExists(trackingNumber)) {
throw new CodeGenerationException("包裹不存在");
}
// 2. 生成唯一码(时间戳+随机数+包裹哈希)
String baseCode = String.format("%d%06d",
System.currentTimeMillis() % 1000000,
secureRandom.nextInt(999999));
String hashedCode = hashCode(baseCode + trackingNumber);
String formattedCode = String.format("%s-%s",
hashedCode.substring(0, 3),
hashedCode.substring(3, 6));
// 3. 创建记录对象
PickupCodeRecord record = new PickupCodeRecord(
formattedCode,
trackingNumber,
System.currentTimeMillis() + EXPIRATION_TIME * 1000
);
// 4. 防重存储CAS操作保证原子性
codeDatabase.putIfAbsent(formattedCode, record);
return new PickupCode(formattedCode, record.getExpirationTime());
}
/**
*
* @param inputCode
* @param phone
* @return
*/
public ValidationResult validatePickupCode(String inputCode, String phone)
throws InvalidCodeException {
// 1. 格式预校验
if (!inputCode.matches("\\d{3}-\\d{3}")) {
throw new InvalidCodeException("格式错误");
}
// 2. 防暴力破解计数器
attemptCounter.merge(phone, 1, Integer::sum);
if (attemptCounter.get(phone) > MAX_ATTEMPTS) {
throw new InvalidCodeException("尝试次数过多请1小时后重试");
}
// 3. 核心验证逻辑
PickupCodeRecord record = codeDatabase.get(inputCode);
if (record == null) {
throw new InvalidCodeException("无效取件码");
}
if (record.isExpired()) {
throw new InvalidCodeException("取件码已过期");
}
if (!record.getTrackingNumber().equals(
expressService.getPackageByPhone(phone).getTrackingNumber())) {
throw new InvalidCodeException("取件码与包裹不匹配");
}
// 4. 验证成功后清理计数器
attemptCounter.remove(phone);
return new ValidationResult(true, record.getTrackingNumber());
}
/**
*
*/
private String hashCode(String input) {
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hashBytes = md.digest(input.getBytes());
return bytesToHex(hashBytes).substring(0, CODE_LENGTH);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("哈希算法不可用", e);
}
}
/**
*
*/
private String bytesToHex(byte[] bytes) {
StringBuilder hexString = new StringBuilder();
for (byte b : bytes) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
}
/**
*
*/
public Optional<PickupCodeInfo> queryCodeInfo(String code) {
PickupCodeRecord record = codeDatabase.get(code);
if (record == null) return Optional.empty();
ExpressItem item = expressService.getPackage(record.getTrackingNumber());
return Optional.of(new PickupCodeInfo(
code,
item.getRecipient(),
item.getPhone(),
new Date(record.getExpirationTime()),
record.isUsed()
));
}
/**
* 使
*/
public void markCodeAsUsed(String code) {
PickupCodeRecord record = codeDatabase.get(code);
if (record != null) {
record.setUsed(true);
}
}
/**
*
*/
public List<PickupCode> batchGenerateCodes(int quantity)
throws CodeGenerationException {
return IntStream.range(0, quantity)
.mapToObj(i -> {
try {
return generatePickupCode(generateTrackingNumber());
} catch (CodeGenerationException e) {
throw new RuntimeException(e);
}
})
.collect(Collectors.toList());
}
/**
*
*/
private String generateTrackingNumber() {
return "TEST" + System.currentTimeMillis() % 1000000;
}
/**
*
*/
public static class PickupCode {
private final String code;
private final long expirationTime;
PickupCode(String code, long expirationTime) {
this.code = code;
this.expirationTime = expirationTime;
}
// Getter方法
public String getCode() { return code; }
public long getExpirationTime() { return expirationTime; }
}
/**
*
*/
public static class ValidationResult {
private final boolean valid;
private final String trackingNumber;
ValidationResult(boolean valid, String trackingNumber) {
this.valid = valid;
this.trackingNumber = trackingNumber;
}
// Getter方法
public boolean isValid() { return valid; }
public String getTrackingNumber() { return trackingNumber; }
}
/**
*
*/
public static class PickupCodeInfo {
private final String code;
private final String recipient;
private final String phone;
private final Date expiration;
private final boolean used;
PickupCodeInfo(String code, String recipient, String phone,
Date expiration, boolean used) {
this.code = code;
this.recipient = recipient;
this.phone = phone;
this.expiration = expiration;
this.used = used;
}
// Getter方法
public String getCode() { return code; }
public String getRecipient() { return recipient; }
public String getPhone() { return phone; }
public Date getExpiration() { return expiration; }
public boolean isUsed() { return used; }
}
/**
*
*/
public static class CodeGenerationException extends Exception {
public CodeGenerationException(String message) {
super(message);
}
}
public static class InvalidCodeException extends Exception {
public InvalidCodeException(String message) {
super(message);
}
}
/**
*
*/
private static class PickupCodeRecord {
private final String code;
private final String trackingNumber;
private final long expirationTime;
private boolean used = false;
PickupCodeRecord(String code, String trackingNumber, long expirationTime) {
this.code = code;
this.trackingNumber = trackingNumber;
this.expirationTime = expirationTime;
}
// Getter/Setter
public String getCode() { return code; }
public String getTrackingNumber() { return trackingNumber; }
public long getExpirationTime() { return expirationTime; }
public boolean isExpired() {
return System.currentTimeMillis() > expirationTime;
}
public boolean isUsed() { return used; }
public void setUsed(boolean used) { this.used = used; }
}
}

@ -1,263 +0,0 @@
import java.security.*;
import java.util.*;
import java.util.regex.*;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
/**
*
* /
*/
class UserManagementService {
// 内存存储结构(实际项目应使用数据库)
private final Map<String, User> userDatabase = new HashMap<>();
private final Map<String, Session> activeSessions = new HashMap<>();
private static final String SECRET_KEY = "express@Sys#Key2025"; // 加密密钥(生产环境应存储在安全配置)
/**
*
* @param username 4-16
* @param password
* @param role admin/staff/customer
* @return
*/
public RegistrationResult registerUser(String username, String password, String role)
throws NoSuchAlgorithmException, InvalidKeySpecException {
// 1. 参数验证
if (!isValidUsername(username)) {
return new RegistrationResult(false, "用户名需为4-16位字母数字");
}
if (userDatabase.containsKey(username)) {
return new RegistrationResult(false, "用户名已存在");
}
if (!isValidPassword(password)) {
return new RegistrationResult(false, "密码需包含大小写字母和数字至少8位");
}
if (!isValidRole(role)) {
return new RegistrationResult(false, "无效角色类型");
}
// 2. 密码加密处理
String salt = generateSalt();
String hashedPwd = hashPassword(password, salt);
// 3. 创建用户对象
User newUser = new User(username, hashedPwd, salt, role);
userDatabase.put(username, newUser);
return new RegistrationResult(true, "注册成功", newUser);
}
/**
*
* @param username
* @param password
* @return
*/
public AuthenticationResult authenticate(String username, String password)
throws NoSuchAlgorithmException, InvalidKeySpecException {
User user = userDatabase.get(username);
if (user == null) {
return new AuthenticationResult(false, "用户不存在");
}
// 验证密码
String testHash = hashPassword(password, user.getSalt());
if (!testHash.equals(user.getHashedPassword())) {
return new AuthenticationResult(false, "密码错误");
}
// 生成会话令牌JWT风格
String token = generateSessionToken(username);
activeSessions.put(token, new Session(token, username, new Date()));
return new AuthenticationResult(true, "认证成功", token);
}
/**
*
* @param password
* @return
*/
private boolean isValidPassword(String password) {
if (password.length() < 8) return false;
boolean hasUpper = false, hasLower = false, hasDigit = false;
for (char c : password.toCharArray()) {
if (Character.isUpperCase(c)) hasUpper = true;
else if (Character.isLowerCase(c)) hasLower = true;
else if (Character.isDigit(c)) hasDigit = true;
}
return hasUpper && hasLower && hasDigit;
}
/**
* 16
*/
private String generateSalt() {
SecureRandom random = new SecureRandom();
byte[] salt = new byte[16];
random.nextBytes(salt);
return Base64.getEncoder().encodeToString(salt);
}
/**
* PBKDF2
*/
private String hashPassword(String password, String salt)
throws NoSuchAlgorithmException, InvalidKeySpecException {
int iterations = 10000;
int keyLength = 256;
char[] passwordChars = password.toCharArray();
byte[] saltBytes = Base64.getDecoder().decode(salt);
PBEKeySpec spec = new PBEKeySpec(passwordChars, saltBytes, iterations, keyLength);
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
byte[] hash = skf.generateSecret(spec).getEncoded();
return String.format("%d$%s$%s",
iterations,
Base64.getEncoder().encodeToString(saltBytes),
Base64.getEncoder().encodeToString(hash));
}
/**
* HMAC-SHA256
*/
private String generateSessionToken(String username) {
try {
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(SECRET_KEY.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
String baseString = username + new Date().getTime();
return Base64.getEncoder().encodeToString(
sha256_HMAC.doFinal(baseString.getBytes())
);
} catch (Exception e) {
throw new RuntimeException("令牌生成失败", e);
}
}
/**
*
* @param requiredRole
*/
public static class RoleValidator {
private final String currentRole;
public RoleValidator(String sessionToken) {
// 实际应从会话中获取用户角色
this.currentRole = "customer"; // 示例值
}
public void validate(String requiredRole) throws InsufficientPermissionsException {
if (!currentRole.equals(requiredRole)) {
throw new InsufficientPermissionsException(
String.format("需要%s权限当前角色%s", requiredRole, currentRole));
}
}
}
/**
*
*/
static class User {
private final String username;
private final String hashedPassword;
private final String salt;
private final String role;
User(String username, String hashedPassword, String salt, String role) {
this.username = username;
this.hashedPassword = hashedPassword;
this.salt = salt;
this.role = role;
}
// Getter方法根据安全需求限制访问
public String getUsername() { return username; }
public String getHashedPassword() { return hashedPassword; }
public String getSalt() { return salt; }
public String getRole() { return role; }
}
/**
*
*/
static class Session {
private final String token;
private final String username;
private final Date createdAt;
Session(String token, String username, Date createdAt) {
this.token = token;
this.username = username;
this.createdAt = createdAt;
}
// Getter方法
public String getToken() { return token; }
public String getUsername() { return username; }
public Date getCreatedAt() { return createdAt; }
}
/**
*
*/
static class RegistrationResult {
private final boolean success;
private final String message;
private final User user;
RegistrationResult(boolean success, String message) {
this(success, message, null);
}
RegistrationResult(boolean success, String message, User user) {
this.success = success;
this.message = message;
this.user = user;
}
// Getter方法
public boolean isSuccess() { return success; }
public String getMessage() { return message; }
public User getUser() { return user; }
}
/**
*
*/
static class AuthenticationResult {
private final boolean success;
private final String message;
private final String token;
AuthenticationResult(boolean success, String message) {
this(success, message, null);
}
AuthenticationResult(boolean success, String message, String token) {
this.success = success;
this.message = message;
this.token = token;
}
// Getter方法
public boolean isSuccess() { return success; }
public String getMessage() { return message; }
public String getToken() { return token; }
}
/**
*
*/
static class InsufficientPermissionsException extends SecurityException {
public InsufficientPermissionsException(String message) {
super(message);
}
}
}

@ -37,146 +37,127 @@ import com.utils.R;
* @email
* @date 2021-03-11
*/
/**
*
* CRUD
*
*
* 1.
* 2.
* 3.
*
* @author
* @email
* @date 2021-03-11
*/
@RestController
@Controller
@RequestMapping("/zhandian")
public class ZhandianController {
private static final Logger logger = LoggerFactory.getLogger(ZhandianController.class);
@Autowired private ZhandianService zhandianService; // 站点核心业务服务
@Autowired private TokenService tokenService; // 用户认证服务
@Autowired private DictionaryService dictionaryService; // 数据字典服务
@Autowired
private ZhandianService zhandianService;
@Autowired
private TokenService tokenService;
@Autowired
private DictionaryService dictionaryService;
//级联表service
/**
*
* @param params page/limit
* @param request HTTP
* @return
*/
*
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request) {
// 日志记录:输出调试信息(使用参数化日志避免字符串拼接)
logger.debug("分页查询参数: {}", JSONObject.toJSONString(params));
// 用户权限校验:普通用户只能查看关联数据
if("用户".equals(request.getSession().getAttribute("role"))) {
params.put("yonghuId", request.getSession().getAttribute("userId"));
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
String role = String.valueOf(request.getSession().getAttribute("role"));
if(StringUtil.isNotEmpty(role) && "用户".equals(role)){
params.put("yonghuId",request.getSession().getAttribute("userId"));
}
// 执行分页查询
PageUtils page = zhandianService.queryPage(params);
// 数据转换:将实体列表转为视图对象并处理字典值
((List<ZhandianView>)page.getList()).forEach(dictionaryService::dictionaryConvert);
//字典表数据转换
List<ZhandianView> list =(List<ZhandianView>)page.getList();
for(ZhandianView c:list){
//修改对应字典表字段
dictionaryService.dictionaryConvert(c);
}
return R.ok().put("data", page);
}
/**
*
* @param id ID
* @return
* @throws 511
*/
*
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id) {
logger.debug("查询站点详情, ID: {}", id);
ZhandianEntity entity = zhandianService.selectById(id);
if(entity == null) return R.error(511, "查不到数据");
// 实体转视图:过滤敏感字段并准备返回数据
ZhandianView view = new ZhandianView();
BeanUtils.copyProperties(entity, view);
// 字典值转换:将编码值转为可读文本
dictionaryService.dictionaryConvert(view);
public R info(@PathVariable("id") Long id){
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
ZhandianEntity zhandian = zhandianService.selectById(id);
if(zhandian !=null){
//entity转view
ZhandianView view = new ZhandianView();
BeanUtils.copyProperties( zhandian , view );//把实体数据重构到view中
//修改对应字典表字段
dictionaryService.dictionaryConvert(view);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
return R.ok().put("data", view);
}
}
/**
*
*/
/**
*
* @param zhandian zdname/address
* @param request HTTP
* @return 200511
*
* @apiNote
* 1. zdname+address
* 2.
*/
@RequestMapping("/add")
public R add(@RequestBody ZhandianEntity zhandian, HttpServletRequest request) {
// 唯一性校验(名称+地址组合唯一)
Wrapper<ZhandianEntity> queryWrapper = new EntityWrapper<ZhandianEntity>()
@RequestMapping("/save")
public R save(@RequestBody ZhandianEntity zhandian, HttpServletRequest request){
logger.debug("save方法:,,Controller:{},,zhandian:{}",this.getClass().getName(),zhandian.toString());
Wrapper<ZhandianEntity> queryWrapper = new EntityWrapper<ZhandianEntity>()
.eq("zdname", zhandian.getZdname())
.eq("address", zhandian.getAddress());
if(zhandianService.selectOne(queryWrapper) == null) {
// 权限校验预留接口(当前注释状态)
zhandianService.insert(zhandian);
return R.ok();
.eq("address", zhandian.getAddress())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
ZhandianEntity zhandianEntity = zhandianService.selectOne(queryWrapper);
if(zhandianEntity==null){
// String role = String.valueOf(request.getSession().getAttribute("role"));
// if("".equals(role)){
// zhandian.set
// }
zhandianService.insert(zhandian);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
return R.error(511, "表中有相同数据");
}
/**
*
* @param zhandian id
* @param request HTTP
* @return 200511
*
* @apiNote
* 1. idzdname+address
* 2.
* 3.
*/
@RequestMapping("/update")
public R update(@RequestBody ZhandianEntity zhandian, HttpServletRequest request) {
// 唯一性校验(排除当前记录)
Wrapper<ZhandianEntity> queryWrapper = new EntityWrapper<ZhandianEntity>()
.notIn("id", zhandian.getId())
/**
*
*/
@RequestMapping("/update")
public R update(@RequestBody ZhandianEntity zhandian, HttpServletRequest request){
logger.debug("update方法:,,Controller:{},,zhandian:{}",this.getClass().getName(),zhandian.toString());
//根据字段查询是否有相同数据
Wrapper<ZhandianEntity> queryWrapper = new EntityWrapper<ZhandianEntity>()
.notIn("id",zhandian.getId())
.eq("zdname", zhandian.getZdname())
.eq("address", zhandian.getAddress());
.eq("address", zhandian.getAddress())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
ZhandianEntity zhandianEntity = zhandianService.selectOne(queryWrapper);
if(zhandianEntity==null){
// String role = String.valueOf(request.getSession().getAttribute("role"));
// if("".equals(role)){
// zhandian.set
// }
zhandianService.updateById(zhandian);//根据id更新
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
logger.info("生成的SQL片段: {}", queryWrapper.getSqlSegment());
if(zhandianService.selectOne(queryWrapper) == null) {
zhandianService.updateById(zhandian);
/**
*
*/
@RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids){
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
zhandianService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
return R.error(511, "表中有相同数据");
}
/**
*
* @param ids ID
* @return
*
* @apiNote
* 1. 使
* 2.
* 3.
*/
@RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids) {
logger.debug("待删除ID列表: {}", Arrays.toString(ids));
int affectRows = zhandianService.deleteBatchIds(Arrays.asList(ids));
return R.ok().put("data", "成功删除"+affectRows+"条记录");
}

@ -0,0 +1,122 @@
package com.interceptor;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import com.annotation.IgnoreAuth;
import com.entity.EIException;
import com.entity.TokenEntity;
import com.service.TokenService;
import com.utils.R;
/**
* (Token)
* Token访
*/
@Component
public class AuthorizationInterceptor implements HandlerInterceptor {
// 定义用于在请求头中存储Token的键名
public static final String LOGIN_TOKEN_KEY = "Token";
// 自动注入TokenService用于处理Token相关业务
@Autowired
private TokenService tokenService;
/**
*
* @param request HttpServletRequest
* @param response HttpServletResponse
* @param handler HandlerMethod
* @return truefalse
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 支持跨域请求,设置相关的响应头信息
// 设置允许的请求方法
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
// 设置预检请求的有效期
response.setHeader("Access-Control-Max-Age", "3600");
// 设置是否允许携带认证信息如Cookie
response.setHeader("Access-Control-Allow-Credentials", "true");
// 设置允许的请求头字段
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization");
// 设置允许的来源使用请求头中的Origin字段值
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
IgnoreAuth annotation;
// 判断处理器是否为HandlerMethod类型
if (handler instanceof HandlerMethod) {
// 如果是获取该方法上的IgnoreAuth注解
annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
} else {
// 如果不是直接返回true可能是静态资源等不需要权限验证的情况
return true;
}
// 从请求头中获取Token
String token = request.getHeader(LOGIN_TOKEN_KEY);
/**
*
*/
// 如果方法上存在IgnoreAuth注解说明不需要验证权限直接返回true
if (annotation!= null) {
return true;
}
TokenEntity tokenEntity = null;
// 如果获取到的Token不为空
if (StringUtils.isNotBlank(token)) {
// 通过TokenService获取Token对应的TokenEntity对象
tokenEntity = tokenService.getTokenEntity(token);
}
// 如果获取到了有效的TokenEntity对象
if (tokenEntity!= null) {
// 将用户ID存入请求的Session中
request.getSession().setAttribute("userId", tokenEntity.getUserid());
// 将用户角色存入请求的Session中
request.getSession().setAttribute("role", tokenEntity.getRole());
// 将表名存入请求的Session中
request.getSession().setAttribute("tableName", tokenEntity.getTablename());
// 将用户名存入请求的Session中
request.getSession().setAttribute("username", tokenEntity.getUsername());
// 验证通过返回true
return true;
}
PrintWriter writer = null;
// 设置响应的字符编码为UTF-8
response.setCharacterEncoding("UTF-8");
// 设置响应的内容类型为application/json并指定字符编码为UTF-8
response.setContentType("application/json; charset=utf-8");
try {
// 获取用于向客户端写入响应的PrintWriter对象
writer = response.getWriter();
// 将包含错误信息的R对象转换为JSON字符串并写入响应
writer.print(JSONObject.toJSONString(R.error(401, "请先登录")));
} finally {
// 确保在使用完PrintWriter后关闭它
if (writer!= null) {
writer.close();
}
}
// throw new EIException("请先登录", 401);
// 验证不通过返回false
return false;
}
}

@ -1,31 +1,53 @@
package com.model.enums;
// 导入Serializable接口该接口用于标记可序列化的类使得对象可以在网络传输或保存到文件中
import java.io.Serializable;
// 导入MyBatis-Plus的IEnum接口用于将枚举类型映射到数据库字段
import com.baomidou.mybatisplus.enums.IEnum;
/**
* IEnum spring-mybatis.xml typeEnumsPackage
* IEnum
*/
public enum TypeEnum implements IEnum {
// 定义枚举常量表示禁用状态对应的整数值为0描述为"禁用"
DISABLED(0, "禁用"),
// 定义枚举常量表示正常状态对应的整数值为1描述为"正常"
NORMAL(1, "正常");
// 定义一个私有常量,用于存储枚举常量对应的整数值,该值将与数据库字段对应
private final int value;
// 定义一个私有常量,用于存储枚举常量的中文描述信息
private final String desc;
/**
*
* @param value
* @param desc
*/
TypeEnum(final int value, final String desc) {
this.value = value;
this.desc = desc;
}
/**
* IEnum
*
* @return
*/
@Override
public Serializable getValue() {
return this.value;
}
/**
*
* 使JacksonJSON使 @JsonValue JSON
* @return
*/
// Jackson 注解为 JsonValue 返回中文 json 描述
public String getDesc() {
return this.desc;
}
}
}

@ -0,0 +1,60 @@
package com.service;
// 导入List接口用于存储有序集合
import java.util.List;
// 导入Map接口用于存储键值对映射
import java.util.Map;
/**
*
*/
public interface CommonService {
/**
*
* @param params Map
* @return
*/
List<String> getOption(Map<String, Object> params);
/**
*
* @param params Map
* @return Map
*/
Map<String, Object> getFollowByOption(Map<String, Object> params);
/**
* sh
* @param params Map
*/
void sh(Map<String, Object> params);
/**
*
* @param params Map
* @return
*/
int remindCount(Map<String, Object> params);
/**
*
* @param params Map
* @return Map
*/
Map<String, Object> selectCal(Map<String, Object> params);
/**
*
* @param params Map
* @return Map
*/
List<Map<String, Object>> selectGroup(Map<String, Object> params);
/**
*
* @param params Map
* @return Map
*/
List<Map<String, Object>> selectValue(Map<String, Object> params);
}

@ -0,0 +1,18 @@
package com.service;
import java.util.Map;
import com.baomidou.mybatisplus.service.IService;
import com.entity.ConfigEntity;
import com.utils.PageUtils;
/**
*
* @author yangliyuan
* @date 20191010 9:18:20
*/
public interface ConfigService extends IService<ConfigEntity> {
PageUtils queryPage(Map<String, Object> params);
}

@ -0,0 +1,21 @@
package com.service;
import com.baomidou.mybatisplus.service.IService;
import com.utils.PageUtils;
import com.entity.DaiquEntity;
import java.util.Map;
/**
*
* @author
* @since 2021-03-11
*/
public interface DaiquService extends IService<DaiquEntity> {
/**
* @param params
* @return
*/
PageUtils queryPage(Map<String, Object> params);
}

@ -0,0 +1,21 @@
package com.service;
import com.baomidou.mybatisplus.service.IService;
import com.utils.PageUtils;
import com.entity.DaiqurenEntity;
import java.util.Map;
/**
*
* @author
* @since 2021-03-11
*/
public interface DaiqurenService extends IService<DaiqurenEntity> {
/**
* @param params
* @return
*/
PageUtils queryPage(Map<String, Object> params);
}

@ -0,0 +1,26 @@
package com.service;
import com.baomidou.mybatisplus.service.IService;
import com.utils.PageUtils;
import com.entity.DictionaryEntity;
import java.util.Map;
/**
*
* @author
* @since 2021-03-11
*/
public interface DictionaryService extends IService<DictionaryEntity> {
/**
* @param params
* @return
*/
PageUtils queryPage(Map<String, Object> params);
/**
*
* @param obj
*/
void dictionaryConvert(Object obj);
}

@ -0,0 +1,21 @@
package com.service;
import com.baomidou.mybatisplus.service.IService;
import com.utils.PageUtils;
import com.entity.JiedanEntity;
import java.util.Map;
/**
*
* @author
* @since 2021-03-11
*/
public interface JiedanService extends IService<JiedanEntity> {
/**
* @param params
* @return
*/
PageUtils queryPage(Map<String, Object> params);
}

@ -0,0 +1,28 @@
package com.service;
import java.util.List;
import java.util.Map;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.IService;
import com.entity.TokenEntity;
import com.utils.PageUtils;
/**
* token
* @author yangliyuan
* @date 20191010 9:18:20
*/
public interface TokenService extends IService<TokenEntity> {
PageUtils queryPage(Map<String, Object> params);
List<TokenEntity> selectListView(Wrapper<TokenEntity> wrapper);
PageUtils queryPage(Map<String, Object> params, Wrapper<TokenEntity> wrapper);
String generateToken(Integer userid, String username, String tableName, String role);
TokenEntity getTokenEntity(String token);
}

@ -0,0 +1,49 @@
package com.service;
// 导入List接口用于表示有序集合可存储多个元素
import java.util.List;
// 导入Map接口用于存储键值对键唯一值可重复
import java.util.Map;
// 导入MyBatis的Param注解用于在Mapper方法中为参数命名
import org.apache.ibatis.annotations.Param;
// 导入MyBatis-Plus的Wrapper类用于构建查询条件
import com.baomidou.mybatisplus.mapper.Wrapper;
// 导入MyBatis-Plus的IService接口提供了常用的CRUD操作方法
import com.baomidou.mybatisplus.service.IService;
// 导入用户实体类,用于表示系统用户的相关属性
import com.entity.UserEntity;
// 导入分页工具类,用于处理分页查询结果
import com.utils.PageUtils;
/**
*
* @author yangliyuan
* @date 20191010 9:18:20
* MyBatis-PlusIService使CRUD
*/
public interface UserService extends IService<UserEntity> {
/**
*
* @param params Map
* @return PageUtils
*/
PageUtils queryPage(Map<String, Object> params);
/**
*
* @param wrapper Wrapper
* @return UserEntity
*/
List<UserEntity> selectListView(Wrapper<UserEntity> wrapper);
/**
*
* @param params Map
* @param wrapper Wrapper
* @return PageUtils
*/
PageUtils queryPage(Map<String, Object> params, Wrapper<UserEntity> wrapper);
}

@ -0,0 +1,21 @@
package com.service;
import com.baomidou.mybatisplus.service.IService;
import com.utils.PageUtils;
import com.entity.YijiedanEntity;
import java.util.Map;
/**
*
* @author
* @since 2021-03-11
*/
public interface YijiedanService extends IService<YijiedanEntity> {
/**
* @param params
* @return
*/
PageUtils queryPage(Map<String, Object> params);
}

@ -0,0 +1,21 @@
package com.service;
import com.baomidou.mybatisplus.service.IService;
import com.utils.PageUtils;
import com.entity.YonghuEntity;
import java.util.Map;
/**
*
* @author
* @since 2021-03-11
*/
public interface YonghuService extends IService<YonghuEntity> {
/**
* @param params
* @return
*/
PageUtils queryPage(Map<String, Object> params);
}

@ -0,0 +1,21 @@
package com.service;
import com.baomidou.mybatisplus.service.IService;
import com.utils.PageUtils;
import com.entity.ZhandianEntity;
import java.util.Map;
/**
*
* @author
* @since 2021-03-11
*/
public interface ZhandianService extends IService<ZhandianEntity> {
/**
* @param params
* @return
*/
PageUtils queryPage(Map<String, Object> params);
}

@ -0,0 +1,61 @@
package com.service.impl;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.dao.CommonDao;
import com.service.CommonService;
/**
*
* @author yangliyuan
* @date 20191010 9:17:59
*/
@Service("commonService")
public class CommonServiceImpl implements CommonService {
@Autowired
private CommonDao commonDao;
@Override
public List<String> getOption(Map<String, Object> params) {
return commonDao.getOption(params);
}
@Override
public Map<String, Object> getFollowByOption(Map<String, Object> params) {
return commonDao.getFollowByOption(params);
}
@Override
public void sh(Map<String, Object> params) {
commonDao.sh(params);
}
@Override
public int remindCount(Map<String, Object> params) {
return commonDao.remindCount(params);
}
@Override
public Map<String, Object> selectCal(Map<String, Object> params) {
return commonDao.selectCal(params);
}
@Override
public List<Map<String, Object>> selectGroup(Map<String, Object> params) {
return commonDao.selectGroup(params);
}
@Override
public List<Map<String, Object>> selectValue(Map<String, Object> params) {
return commonDao.selectValue(params);
}
}

@ -0,0 +1,35 @@
package com.service.impl;
import java.util.Map;
import com.entity.ConfigEntity;
import com.utils.Query;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.dao.ConfigDao;
import com.service.ConfigService;
import com.utils.PageUtils;
import org.springframework.transaction.annotation.Transactional;
/**
*
* @author yangliyuan
* @date 20191010 9:17:59
*/
@Service("configService")
public class ConfigServiceImpl extends ServiceImpl<ConfigDao, ConfigEntity> implements ConfigService {
@Override
public PageUtils queryPage(Map<String, Object> params) {
Page<ConfigEntity> page = this.selectPage(
new Query<ConfigEntity>(params).getPage(),
new EntityWrapper<ConfigEntity>()
);
return new PageUtils(page);
}
}

@ -0,0 +1,41 @@
package com.service.impl;
import com.utils.StringUtil;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.*;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import com.utils.PageUtils;
import com.utils.Query;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.dao.DaiquDao;
import com.entity.DaiquEntity;
import com.service.DaiquService;
import com.entity.view.DaiquView;
/**
*
* @author
* @since 2021-03-11
*/
@Service("daiquService")
@Transactional
public class DaiquServiceImpl extends ServiceImpl<DaiquDao, DaiquEntity> implements DaiquService {
@Override
public PageUtils queryPage(Map<String,Object> params) {
if(params != null && (params.get("limit") == null || params.get("page") == null)){
params.put("page","1");
params.put("limit","10");
}
Page<DaiquView> page =new Query<DaiquView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,params));
return new PageUtils(page);
}
}

@ -0,0 +1,41 @@
package com.service.impl;
import com.utils.StringUtil;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.*;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import com.utils.PageUtils;
import com.utils.Query;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.dao.DaiqurenDao;
import com.entity.DaiqurenEntity;
import com.service.DaiqurenService;
import com.entity.view.DaiqurenView;
/**
*
* @author
* @since 2021-03-11
*/
@Service("daiqurenService")
@Transactional
public class DaiqurenServiceImpl extends ServiceImpl<DaiqurenDao, DaiqurenEntity> implements DaiqurenService {
@Override
public PageUtils queryPage(Map<String,Object> params) {
if(params != null && (params.get("limit") == null || params.get("page") == null)){
params.put("page","1");
params.put("limit","10");
}
Page<DaiqurenView> page =new Query<DaiqurenView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,params));
return new PageUtils(page);
}
}

@ -0,0 +1,120 @@
package com.service.impl;
import com.utils.StringUtil;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.*;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import com.utils.PageUtils;
import com.utils.Query;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.dao.DictionaryDao;
import com.entity.DictionaryEntity;
import com.service.DictionaryService;
import com.entity.view.DictionaryView;
/**
*
* @author
* @since 2021-03-11
*/
@Service("dictionaryService")
@Transactional
public class DictionaryServiceImpl extends ServiceImpl<DictionaryDao, DictionaryEntity> implements DictionaryService {
@Override
public PageUtils queryPage(Map<String,Object> params) {
if(params != null && (params.get("limit") == null || params.get("page") == null)){
params.put("page","1");
params.put("limit","10");
}
Page<DictionaryView> page =new Query<DictionaryView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,params));
return new PageUtils(page);
}
/**
*
* @param obj view
*/
public void dictionaryConvert(Object obj) {
try {
if (obj == null) return;
//当前view和entity中的所有types的字段
List<String> fieldNameList = new ArrayList<>();
Class tempClass = obj.getClass();
while (tempClass !=null) {
Field[] declaredFields = tempClass.getDeclaredFields();
for (Field f : declaredFields) {
f.setAccessible(true);
if (f.getType().getName().equals("java.lang.Integer") && f.getName().contains("Types")) {
fieldNameList.add(f.getName());
}
}
tempClass = tempClass.getSuperclass(); //得到父类,然后赋给自己
}
// 获取监听器中的字典表
ServletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext();
Map<String, Map<Integer, String>> dictionaryMap= (Map<String, Map<Integer, String>>) servletContext.getAttribute("dictionaryMap");
//通过Types的值给Value字段赋值
for (String s : fieldNameList) {
Field types = null;
if(hasField(obj.getClass(),s)){
//判断view中有没有这个字段,有就通过反射取出字段
types= obj.getClass().getDeclaredField(s);//获取Types私有字段
}else{
//本表中没有这个字段,说明它是父表中的字段,也就是entity中的字段,从entity中取值
types=obj.getClass().getSuperclass().getDeclaredField(s);
}
Field value = obj.getClass().getDeclaredField(s.replace("Types", "Value"));//获取value私有字段
//设置权限
types.setAccessible(true);
value.setAccessible(true);
//赋值
if (StringUtil.isNotEmpty(String.valueOf(types.get(obj)))) { //types的值不为空
int i = Integer.parseInt(String.valueOf(types.get(obj)));//type
String s1 = s.replace("Types", "_types");
String s2 = dictionaryMap.get(s1).get(i);
value.set(obj, s2);
} else {
new Exception("字典表赋值出现问题::::"+value.getName());
value.set(obj, "");
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
* @param c
* @param fieldName
* @return
*/
public boolean hasField(Class c, String fieldName){
Field[] fields = c.getDeclaredFields();
for (Field f : fields) {
if (fieldName.equals(f.getName())) {
return true;
}
}
return false;
}
}

@ -0,0 +1,41 @@
package com.service.impl;
import com.utils.StringUtil;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.*;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import com.utils.PageUtils;
import com.utils.Query;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.dao.JiedanDao;
import com.entity.JiedanEntity;
import com.service.JiedanService;
import com.entity.view.JiedanView;
/**
*
* @author
* @since 2021-03-11
*/
@Service("jiedanService")
@Transactional
public class JiedanServiceImpl extends ServiceImpl<JiedanDao, JiedanEntity> implements JiedanService {
@Override
public PageUtils queryPage(Map<String,Object> params) {
if(params != null && (params.get("limit") == null || params.get("page") == null)){
params.put("page","1");
params.put("limit","10");
}
Page<JiedanView> page =new Query<JiedanView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,params));
return new PageUtils(page);
}
}

@ -0,0 +1,81 @@
package com.service.impl;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.dao.TokenDao;
import com.entity.TokenEntity;
import com.entity.TokenEntity;
import com.service.TokenService;
import com.utils.CommonUtil;
import com.utils.PageUtils;
import com.utils.Query;
/**
* token
* @author yangliyuan
* @date 20191010 9:17:59
*/
@Service("tokenService")
public class TokenServiceImpl extends ServiceImpl<TokenDao, TokenEntity> implements TokenService {
@Override
public PageUtils queryPage(Map<String, Object> params) {
Page<TokenEntity> page = this.selectPage(
new Query<TokenEntity>(params).getPage(),
new EntityWrapper<TokenEntity>()
);
return new PageUtils(page);
}
@Override
public List<TokenEntity> selectListView(Wrapper<TokenEntity> wrapper) {
return baseMapper.selectListView(wrapper);
}
@Override
public PageUtils queryPage(Map<String, Object> params,
Wrapper<TokenEntity> wrapper) {
Page<TokenEntity> page =new Query<TokenEntity>(params).getPage();
page.setRecords(baseMapper.selectListView(page,wrapper));
PageUtils pageUtil = new PageUtils(page);
return pageUtil;
}
@Override
public String generateToken(Integer userid,String username, String tableName, String role) {
TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("userid", userid).eq("role", role));
String token = CommonUtil.getRandomString(32);
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.HOUR_OF_DAY, 1);
if(tokenEntity!=null) {
tokenEntity.setToken(token);
tokenEntity.setExpiratedtime(cal.getTime());
this.updateById(tokenEntity);
} else {
this.insert(new TokenEntity(userid,username, tableName, role, token, cal.getTime()));
}
return token;
}
@Override
public TokenEntity getTokenEntity(String token) {
TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("token", token));
if(tokenEntity == null || tokenEntity.getExpiratedtime().getTime()<new Date().getTime()) {
return null;
}
return tokenEntity;
}
}

@ -0,0 +1,51 @@
package com.service.impl;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.dao.UserDao;
import com.entity.UserEntity;
import com.service.UserService;
import com.utils.PageUtils;
import com.utils.Query;
/**
*
* @author yangliyuan
* @date 20191010 9:17:59
*/
@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements UserService {
@Override
public PageUtils queryPage(Map<String, Object> params) {
Page<UserEntity> page = this.selectPage(
new Query<UserEntity>(params).getPage(),
new EntityWrapper<UserEntity>()
);
return new PageUtils(page);
}
@Override
public List<UserEntity> selectListView(Wrapper<UserEntity> wrapper) {
return baseMapper.selectListView(wrapper);
}
@Override
public PageUtils queryPage(Map<String, Object> params,
Wrapper<UserEntity> wrapper) {
Page<UserEntity> page =new Query<UserEntity>(params).getPage();
page.setRecords(baseMapper.selectListView(page,wrapper));
PageUtils pageUtil = new PageUtils(page);
return pageUtil;
}
}

@ -0,0 +1,41 @@
package com.service.impl;
import com.utils.StringUtil;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.*;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import com.utils.PageUtils;
import com.utils.Query;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.dao.YijiedanDao;
import com.entity.YijiedanEntity;
import com.service.YijiedanService;
import com.entity.view.YijiedanView;
/**
*
* @author
* @since 2021-03-11
*/
@Service("yijiedanService")
@Transactional
public class YijiedanServiceImpl extends ServiceImpl<YijiedanDao, YijiedanEntity> implements YijiedanService {
@Override
public PageUtils queryPage(Map<String,Object> params) {
if(params != null && (params.get("limit") == null || params.get("page") == null)){
params.put("page","1");
params.put("limit","10");
}
Page<YijiedanView> page =new Query<YijiedanView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,params));
return new PageUtils(page);
}
}

@ -0,0 +1,41 @@
package com.service.impl;
import com.utils.StringUtil;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.*;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import com.utils.PageUtils;
import com.utils.Query;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.dao.YonghuDao;
import com.entity.YonghuEntity;
import com.service.YonghuService;
import com.entity.view.YonghuView;
/**
*
* @author
* @since 2021-03-11
*/
@Service("yonghuService")
@Transactional
public class YonghuServiceImpl extends ServiceImpl<YonghuDao, YonghuEntity> implements YonghuService {
@Override
public PageUtils queryPage(Map<String,Object> params) {
if(params != null && (params.get("limit") == null || params.get("page") == null)){
params.put("page","1");
params.put("limit","10");
}
Page<YonghuView> page =new Query<YonghuView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,params));
return new PageUtils(page);
}
}

@ -0,0 +1,41 @@
package com.service.impl;
import com.utils.StringUtil;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.*;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import com.utils.PageUtils;
import com.utils.Query;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.dao.ZhandianDao;
import com.entity.ZhandianEntity;
import com.service.ZhandianService;
import com.entity.view.ZhandianView;
/**
*
* @author
* @since 2021-03-11
*/
@Service("zhandianService")
@Transactional
public class ZhandianServiceImpl extends ServiceImpl<ZhandianDao, ZhandianEntity> implements ZhandianService {
@Override
public PageUtils queryPage(Map<String,Object> params) {
if(params != null && (params.get("limit") == null || params.get("page") == null)){
params.put("page","1");
params.put("limit","10");
}
Page<ZhandianView> page =new Query<ZhandianView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,params));
return new PageUtils(page);
}
}

@ -0,0 +1,122 @@
package com.utils;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONObject;
/**
* @author yangliyuan
* @version 202027 9:37:05
* : API访token
*/
public class BaiduUtil {
/**
*
* @param key APIakAPI Key
* @param lng
* @param lat
* @return Mapnull
*/
public static Map<String, String> getCityByLonLat(String key, String lng, String lat) {
// 将纬度和经度组合成location字符串格式为 "纬度,经度"
String location = lat + "," + lng;
try {
// 拼装请求百度地图逆地理编码API的URL
String url = "http://api.map.baidu.com/reverse_geocoding/v3/?ak="+key+"&output=json&coordtype=wgs84ll&location="+location;
// 调用HttpClientUtils的doGet方法发送GET请求并获取响应结果
String result = HttpClientUtils.doGet(url);
// 将响应结果字符串转换为JSONObject对象
JSONObject o = new JSONObject(result);
// 创建一个HashMap用于存储省、市、区、街道信息
Map<String, String> area = new HashMap<>();
// 从响应结果中提取省份信息并放入Map中
area.put("province", o.getJSONObject("result").getJSONObject("addressComponent").getString("province"));
// 从响应结果中提取城市信息并放入Map中
area.put("city", o.getJSONObject("result").getJSONObject("addressComponent").getString("city"));
// 从响应结果中提取区域信息并放入Map中
area.put("district", o.getJSONObject("result").getJSONObject("addressComponent").getString("district"));
// 从响应结果中提取街道信息并放入Map中
area.put("street", o.getJSONObject("result").getJSONObject("addressComponent").getString("street"));
// 返回包含省、市、区、街道信息的Map
return area;
} catch (Exception e) {
// 若出现异常,打印异常堆栈信息
e.printStackTrace();
}
// 若出现异常返回null
return null;
}
/**
* API访token
* token.
* @param ak - API Key
* @param sk - Securet Key
* @return assess_token 访tokennull
*/
public static String getAuth(String ak, String sk) {
// 定义获取token的请求地址
String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
// 拼接完整的获取token的URL
String getAccessTokenUrl = authHost
// 1. grant_type为固定参数
+ "grant_type=client_credentials"
// 2. 官网获取的 API Key
+ "&client_id=" + ak
// 3. 官网获取的 Secret Key
+ "&client_secret=" + sk;
try {
// 创建URL对象
URL realUrl = new URL(getAccessTokenUrl);
// 打开和URL之间的连接
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
// 设置请求方法为GET
connection.setRequestMethod("GET");
// 建立连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段并打印
for (String key : map.keySet()) {
System.err.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
// 用于存储响应结果的字符串
String result = "";
// 用于临时存储每行响应内容的字符串
String line;
// 逐行读取响应内容并拼接成完整的结果
while ((line = in.readLine()) != null) {
result += line;
}
/**
*
*/
// 打印响应结果
System.err.println("result:" + result);
// 将响应结果字符串转换为JSONObject对象
org.json.JSONObject jsonObject = new org.json.JSONObject(result);
// 从JSONObject中提取access_token字段的值
String access_token = jsonObject.getString("access_token");
// 返回access_token
return access_token;
} catch (Exception e) {
// 若获取token失败打印错误提示信息
System.err.printf("获取token失败");
// 打印异常堆栈信息到标准错误输出
e.printStackTrace(System.err);
}
// 若获取token失败返回null
return null;
}
}

@ -0,0 +1,33 @@
package com.utils;
// 导入Random类用于生成随机数
import java.util.Random;
/**
*
*/
public class CommonUtil {
/**
*
*
* @param num
* @return
*/
public static String getRandomString(Integer num) {
// 定义一个包含所有可能字符的基础字符串,由小写字母和数字组成
String base = "abcdefghijklmnopqrstuvwxyz0123456789";
// 创建一个Random对象用于生成随机数
Random random = new Random();
// 创建一个StringBuffer对象用于动态拼接字符
StringBuffer sb = new StringBuffer();
// 循环num次每次生成一个随机字符并添加到StringBuffer中
for (int i = 0; i < num; i++) {
// 生成一个0到base字符串长度之间的随机整数
int number = random.nextInt(base.length());
// 根据随机整数从base字符串中取出对应的字符并添加到StringBuffer中
sb.append(base.charAt(number));
}
// 将StringBuffer对象转换为字符串并返回
return sb.toString();
}
}

@ -0,0 +1,29 @@
package com.utils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* @author yangliyuan
* @version 202027 8:01:14
* :
*/
public class FileUtil {
public static byte[] FileToByte(File file) throws IOException {
// 将数据转为流
@SuppressWarnings("resource")
InputStream content = new FileInputStream(file);
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
byte[] buff = new byte[100];
int rc = 0;
while ((rc = content.read(buff, 0, 100)) > 0) {
swapStream.write(buff, 0, rc);
}
// 获得二进制数组
return swapStream.toByteArray();
}
}

@ -0,0 +1,56 @@
package com.utils;
// 导入BufferedReader类用于缓冲字符输入流提高读取效率
import java.io.BufferedReader;
// 导入InputStreamReader类用于将字节流转换为字符流
import java.io.InputStreamReader;
// 导入HttpURLConnection类用于创建HTTP连接并进行通信
import java.net.HttpURLConnection;
// 导入URL类用于表示统一资源定位符
import java.net.URL;
/**
* HttpClient
* HTTPGET
*/
public class HttpClientUtils {
/**
* GET访URL
* @param uri 访URL
* @return null
* @description get
* @author: long.he01
*/
public static String doGet(String uri) {
// 创建一个StringBuilder对象用于拼接响应结果
StringBuilder result = new StringBuilder();
try {
// 定义一个字符串变量,用于存储最终的响应结果
String res = "";
// 根据传入的uri创建一个URL对象
URL url = new URL(uri);
// 打开URL连接并将其转换为HttpURLConnection对象以便进行HTTP通信
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 创建一个BufferedReader对象用于读取服务器响应的输入流指定字符编码为UTF-8
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
// 定义一个字符串变量,用于临时存储每行响应内容
String line;
// 逐行读取服务器响应内容,直到读取完毕
while ((line = in.readLine()) != null) {
// 将每行响应内容添加到res字符串中并在末尾添加换行符
res += line + "\n";
}
// 关闭BufferedReader对象释放资源
in.close();
// 返回最终的响应结果
return res;
} catch (Exception e) {
// 若发生异常,打印异常堆栈信息
e.printStackTrace();
// 发生异常时返回null
return null;
}
}
}

@ -0,0 +1,54 @@
package com.utils;
public class JQPageInfo{
private Integer page;
private Integer limit;
private String sidx;
private String order;
private Integer offset;
public Integer getPage() {
return page;
}
public void setPage(Integer page) {
this.page = page;
}
public Integer getLimit() {
return limit;
}
public void setLimit(Integer limit) {
this.limit = limit;
}
public String getSidx() {
return sidx;
}
public void setSidx(String sidx) {
this.sidx = sidx;
}
public String getOrder() {
return order;
}
public void setOrder(String order) {
this.order = order;
}
public Integer getOffset() {
return offset;
}
public void setOffset(Integer offset) {
this.offset = offset;
}
}

@ -0,0 +1,276 @@
package com.utils;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.mapper.Wrapper;
/**
* Mybatis-Plus
* MyBatis-Plus
*/
public class MPUtil {
// 定义一个字符常量,表示下划线字符
public static final char UNDERLINE = '_';
// 将对象的属性转换为Map并将属性名从驼峰格式转换为下划线格式同时添加前缀
// mybatis plus allEQ 表达式转换
public static Map allEQMapPre(Object bean, String pre) {
// 将对象转换为Map使用BeanUtil工具类的beanToMap方法
Map<String, Object> map = BeanUtil.beanToMap(bean);
// 将Map中的键从驼峰格式转换为下划线格式并添加前缀
return camelToUnderlineMap(map, pre);
}
// 将对象的属性转换为Map并将属性名从驼峰格式转换为下划线格式
// mybatis plus allEQ 表达式转换
public static Map allEQMap(Object bean) {
// 将对象转换为Map使用BeanUtil工具类的beanToMap方法
Map<String, Object> map = BeanUtil.beanToMap(bean);
// 将Map中的键从驼峰格式转换为下划线格式不添加前缀
return camelToUnderlineMap(map, "");
}
// 根据对象属性生成模糊查询条件,并添加前缀
public static Wrapper allLikePre(Wrapper wrapper, Object bean, String pre) {
// 将对象转换为Map使用BeanUtil工具类的beanToMap方法
Map<String, Object> map = BeanUtil.beanToMap(bean);
// 将Map中的键从驼峰格式转换为下划线格式并添加前缀
Map result = camelToUnderlineMap(map, pre);
// 根据转换后的Map生成模糊查询条件
return genLike(wrapper, result);
}
// 根据对象属性生成模糊查询条件
public static Wrapper allLike(Wrapper wrapper, Object bean) {
// 将对象转换为Map忽略空值和默认值使用BeanUtil工具类的beanToMap方法
Map result = BeanUtil.beanToMap(bean, true, true);
// 根据转换后的Map生成模糊查询条件
return genLike(wrapper, result);
}
// 根据Map生成模糊查询条件
public static Wrapper genLike(Wrapper wrapper, Map param) {
// 获取Map的键值对迭代器
Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
// 初始化计数器
int i = 0;
// 遍历Map的键值对
while (it.hasNext()) {
// 如果不是第一个条件,添加逻辑与操作
if (i > 0) wrapper.and();
// 获取当前键值对
Map.Entry<String, Object> entry = it.next();
// 获取键
String key = entry.getKey();
// 获取值
String value = (String) entry.getValue();
// 添加模糊查询条件
wrapper.like(key, value);
// 计数器加1
i++;
}
// 返回生成好的条件构造器
return wrapper;
}
// 根据对象属性生成模糊查询或等于查询条件
public static Wrapper likeOrEq(Wrapper wrapper, Object bean) {
// 将对象转换为Map忽略空值和默认值使用BeanUtil工具类的beanToMap方法
Map result = BeanUtil.beanToMap(bean, true, true);
// 根据转换后的Map生成模糊查询或等于查询条件
return genLikeOrEq(wrapper, result);
}
// 根据Map生成模糊查询或等于查询条件
public static Wrapper genLikeOrEq(Wrapper wrapper, Map param) {
// 获取Map的键值对迭代器
Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
// 初始化计数器
int i = 0;
// 遍历Map的键值对
while (it.hasNext()) {
// 如果不是第一个条件,添加逻辑与操作
if (i > 0) wrapper.and();
// 获取当前键值对
Map.Entry<String, Object> entry = it.next();
// 获取键
String key = entry.getKey();
// 判断值中是否包含百分号(模糊查询标志)
if (entry.getValue().toString().contains("%")) {
// 如果包含百分号,添加模糊查询条件,并去除百分号
wrapper.like(key, entry.getValue().toString().replace("%", ""));
} else {
// 如果不包含百分号,添加等于查询条件
wrapper.eq(key, entry.getValue());
}
// 计数器加1
i++;
}
// 返回生成好的条件构造器
return wrapper;
}
// 根据对象属性生成等于查询条件
public static Wrapper allEq(Wrapper wrapper, Object bean) {
// 将对象转换为Map忽略空值和默认值使用BeanUtil工具类的beanToMap方法
Map result = BeanUtil.beanToMap(bean, true, true);
// 根据转换后的Map生成等于查询条件
return genEq(wrapper, result);
}
// 根据Map生成等于查询条件
public static Wrapper genEq(Wrapper wrapper, Map param) {
// 获取Map的键值对迭代器
Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
// 初始化计数器
int i = 0;
// 遍历Map的键值对
while (it.hasNext()) {
// 如果不是第一个条件,添加逻辑与操作
if (i > 0) wrapper.and();
// 获取当前键值对
Map.Entry<String, Object> entry = it.next();
// 获取键
String key = entry.getKey();
// 添加等于查询条件
wrapper.eq(key, entry.getValue());
// 计数器加1
i++;
}
// 返回生成好的条件构造器
return wrapper;
}
// 根据Map中的键值对生成范围查询条件大于等于和小于等于
public static Wrapper between(Wrapper wrapper, Map<String, Object> params) {
// 遍历Map的键
for (String key : params.keySet()) {
// 定义列名变量
String columnName = "";
// 如果键以"_start"结尾
if (key.endsWith("_start")) {
// 提取列名
columnName = key.substring(0, key.indexOf("_start"));
// 如果值不为空
if (StringUtils.isNotBlank(params.get(key).toString())) {
// 添加大于等于查询条件
wrapper.ge(columnName, params.get(key));
}
}
// 如果键以"_end"结尾
if (key.endsWith("_end")) {
// 提取列名
columnName = key.substring(0, key.indexOf("_end"));
// 如果值不为空
if (StringUtils.isNotBlank(params.get(key).toString())) {
// 添加小于等于查询条件
wrapper.le(columnName, params.get(key));
}
}
}
// 返回生成好的条件构造器
return wrapper;
}
// 根据Map中的排序参数生成排序条件
public static Wrapper sort(Wrapper wrapper, Map<String, Object> params) {
// 定义排序方向变量
String order = "";
// 如果排序方向参数不为空
if (params.get("order") != null && StringUtils.isNotBlank(params.get("order").toString())) {
// 获取排序方向
order = params.get("order").toString();
}
// 如果排序字段参数不为空
if (params.get("sort") != null && StringUtils.isNotBlank(params.get("sort").toString())) {
// 如果排序方向为降序
if (order.equalsIgnoreCase("desc")) {
// 添加降序排序条件
wrapper.orderDesc(Arrays.asList(params.get("sort")));
} else {
// 添加升序排序条件
wrapper.orderAsc(Arrays.asList(params.get("sort")));
}
}
// 返回生成好的条件构造器
return wrapper;
}
/**
* 线
*
* @param param
* @return 线
*/
public static String camelToUnderline(String param) {
// 如果参数为空或为空字符串
if (param == null || "".equals(param.trim())) {
// 返回空字符串
return "";
}
// 获取字符串长度
int len = param.length();
// 创建一个StringBuilder对象
StringBuilder sb = new StringBuilder(len);
// 遍历字符串
for (int i = 0; i < len; i++) {
// 获取当前字符
char c = param.charAt(i);
// 如果字符是大写字母
if (Character.isUpperCase(c)) {
// 添加下划线
sb.append(UNDERLINE);
// 添加转换为小写后的字符
sb.append(Character.toLowerCase(c));
} else {
// 添加当前字符
sb.append(c);
}
}
// 返回转换后的字符串
return sb.toString();
}
// 测试方法,用于测试驼峰转下划线方法
public static void main(String[] ages) {
// 输出转换后的字符串
System.out.println(camelToUnderline("ABCddfANM"));
}
// 将Map中的键从驼峰格式转换为下划线格式并根据前缀进行处理
public static Map camelToUnderlineMap(Map param, String pre) {
// 创建一个新的HashMap
Map<String, Object> newMap = new HashMap<String, Object>();
// 获取Map的键值对迭代器
Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
// 遍历Map的键值对
while (it.hasNext()) {
// 获取当前键值对
Map.Entry<String, Object> entry = it.next();
// 获取键
String key = entry.getKey();
// 将键从驼峰格式转换为下划线格式
String newKey = camelToUnderline(key);
// 根据前缀的情况进行处理
if (pre.endsWith(".")) {
// 如果前缀以点结尾,直接添加前缀和新键
newMap.put(pre + newKey, entry.getValue());
} else if (StringUtils.isEmpty(pre)) {
// 如果前缀为空,只添加新键
newMap.put(newKey, entry.getValue());
} else {
// 否则,添加前缀、点和新键
newMap.put(pre + "." + newKey, entry.getValue());
}
}
// 返回转换后的Map
return newMap;
}
}

@ -0,0 +1,101 @@
package com.utils;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import com.baomidou.mybatisplus.plugins.Page;
/**
*
*/
public class PageUtils implements Serializable {
private static final long serialVersionUID = 1L;
//总记录数
private long total;
//每页记录数
private int pageSize;
//总页数
private long totalPage;
//当前页数
private int currPage;
//列表数据
private List<?> list;
/**
*
* @param list
* @param totalCount
* @param pageSize
* @param currPage
*/
public PageUtils(List<?> list, int totalCount, int pageSize, int currPage) {
this.list = list;
this.total = totalCount;
this.pageSize = pageSize;
this.currPage = currPage;
this.totalPage = (int)Math.ceil((double)totalCount/pageSize);
}
/**
*
*/
public PageUtils(Page<?> page) {
this.list = page.getRecords();
this.total = page.getTotal();
this.pageSize = page.getSize();
this.currPage = page.getCurrent();
this.totalPage = page.getPages();
}
/*
*
*/
public PageUtils(Map<String, Object> params) {
Page page =new Query(params).getPage();
new PageUtils(page);
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getCurrPage() {
return currPage;
}
public void setCurrPage(int currPage) {
this.currPage = currPage;
}
public List<?> getList() {
return list;
}
public void setList(List<?> list) {
this.list = list;
}
public long getTotalPage() {
return totalPage;
}
public void setTotalPage(long totalPage) {
this.totalPage = totalPage;
}
public long getTotal() {
return total;
}
public void setTotal(long total) {
this.total = total;
}
}

@ -0,0 +1,133 @@
package com.utils;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import com.baomidou.mybatisplus.plugins.Page;
/**
*
* LinkedHashMap
*/
public class Query<T> extends LinkedHashMap<String, Object> {
// 序列化版本号,用于兼容不同版本的序列化和反序列化操作
private static final long serialVersionUID = 1L;
/**
* mybatis-plus
* MyBatis-Plus
*/
private Page<T> page;
/**
*
* 1
*/
private int currPage = 1;
/**
*
* 10
*/
private int limit = 10;
/**
* JQPageInfo
* @param pageInfo JQPageInfo
*/
public Query(JQPageInfo pageInfo) {
// 分页参数处理
// 如果JQPageInfo中的page参数不为空设置当前页码
if (pageInfo.getPage()!= null) {
currPage = pageInfo.getPage();
}
// 如果JQPageInfo中的limit参数不为空设置每页条数
if (pageInfo.getLimit()!= null) {
limit = pageInfo.getLimit();
}
// 防止SQL注入因为sidx、order是通过拼接SQL实现排序的会有SQL注入风险
// 对JQPageInfo中的sidx参数进行SQL注入过滤
String sidx = SQLFilter.sqlInject(pageInfo.getSidx());
// 对JQPageInfo中的order参数进行SQL注入过滤
String order = SQLFilter.sqlInject(pageInfo.getOrder());
// mybatis-plus分页
// 创建MyBatis-Plus的分页对象传入当前页码和每页条数
this.page = new Page<>(currPage, limit);
// 排序
// 如果sidx和order都不为空设置排序字段和排序方向
if (StringUtils.isNotBlank(sidx) && StringUtils.isNotBlank(order)) {
this.page.setOrderByField(sidx);
this.page.setAsc("ASC".equalsIgnoreCase(order));
}
}
/**
* Map
* @param params Map
*/
public Query(Map<String, Object> params) {
// 将传入的参数Map中的所有键值对放入当前对象中
this.putAll(params);
// 分页参数处理
// 如果params中的page参数不为空设置当前页码
if (params.get("page")!= null) {
currPage = Integer.parseInt((String) params.get("page"));
}
// 如果params中的limit参数不为空设置每页条数
if (params.get("limit")!= null) {
limit = Integer.parseInt((String) params.get("limit"));
}
// 计算偏移量并将相关分页参数放入当前对象中
this.put("offset", (currPage - 1) * limit);
this.put("page", currPage);
this.put("limit", limit);
// 防止SQL注入因为sidx、order是通过拼接SQL实现排序的会有SQL注入风险
// 对params中的sidx参数进行SQL注入过滤
String sidx = SQLFilter.sqlInject((String) params.get("sidx"));
// 对params中的order参数进行SQL注入过滤
String order = SQLFilter.sqlInject((String) params.get("order"));
// 将过滤后的sidx和order参数放入当前对象中
this.put("sidx", sidx);
this.put("order", order);
// mybatis-plus分页
// 创建MyBatis-Plus的分页对象传入当前页码和每页条数
this.page = new Page<>(currPage, limit);
// 排序
// 如果sidx和order都不为空设置排序字段和排序方向
if (StringUtils.isNotBlank(sidx) && StringUtils.isNotBlank(order)) {
this.page.setOrderByField(sidx);
this.page.setAsc("ASC".equalsIgnoreCase(order));
}
}
/**
* MyBatis-Plus
* @return MyBatis-PlusPage<T>
*/
public Page<T> getPage() {
return page;
}
/**
*
* @return
*/
public int getCurrPage() {
return currPage;
}
/**
*
*/
public int getLimit() {
return limit;
}
}

@ -0,0 +1,111 @@
package com.utils;
import java.util.HashMap;
import java.util.Map;
/**
*
* HashMap
*/
public class R extends HashMap<String, Object> {
// 序列化版本号,用于保证序列化和反序列化过程中类的版本一致性
private static final long serialVersionUID = 1L;
/**
*
* 0
*/
public R() {
// 向 Map 中放入状态码0 通常表示成功
put("code", 0);
}
/**
* R
* 500 "未知异常,请联系管理员"
* @return R
*/
public static R error() {
// 调用另一个 error 方法,传入默认的状态码和错误消息
return error(500, "未知异常,请联系管理员");
}
/**
* R 使
* 500
* @param msg
* @return R
*/
public static R error(String msg) {
// 调用另一个 error 方法,传入默认的状态码和自定义的错误消息
return error(500, msg);
}
/**
* R 使
* @param code
* @param msg
* @return R
*/
public static R error(int code, String msg) {
// 创建一个新的 R 对象
R r = new R();
// 向 R 对象中放入自定义的状态码
r.put("code", code);
// 向 R 对象中放入自定义的错误消息
r.put("msg", msg);
// 返回包含错误信息的 R 对象
return r;
}
/**
* R 使
* @param msg
* @return R
*/
public static R ok(String msg) {
// 创建一个新的 R 对象
R r = new R();
// 向 R 对象中放入自定义的成功消息
r.put("msg", msg);
// 返回包含成功信息的 R 对象
return r;
}
/**
* R Map R
* @param map Map
* @return R
*/
public static R ok(Map<String, Object> map) {
// 创建一个新的 R 对象
R r = new R();
// 将传入的 Map 中的所有键值对放入 R 对象中
r.putAll(map);
// 返回包含成功信息和自定义数据的 R 对象
return r;
}
/**
* R
* 使 0
* @return R
*/
public static R ok() {
// 创建并返回一个新的 R 对象
return new R();
}
/**
* R R 便
* @param key
* @param value
* @return R
*/
public R put(String key, Object value) {
// 调用父类的 put 方法,将键值对放入 Map 中
super.put(key, value);
// 返回当前 R 对象,方便链式调用
return this;
}
}

@ -0,0 +1,42 @@
package com.utils;
import org.apache.commons.lang3.StringUtils;
import com.entity.EIException;
/**
* SQL
*/
public class SQLFilter {
/**
* SQL
* @param str
*/
public static String sqlInject(String str){
if(StringUtils.isBlank(str)){
return null;
}
//去掉'|"|;|\字符
str = StringUtils.replace(str, "'", "");
str = StringUtils.replace(str, "\"", "");
str = StringUtils.replace(str, ";", "");
str = StringUtils.replace(str, "\\", "");
//转换成小写
str = str.toLowerCase();
//非法字符
String[] keywords = {"master", "truncate", "insert", "select", "delete", "update", "declare", "alter", "drop"};
//判断是否包含非法字符
for(String keyword : keywords){
if(str.indexOf(keyword) != -1){
throw new EIException("包含非法字符");
}
}
return str;
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save