init
This commit is contained in:
commit
8d1d44bee7
10
MySQL/config/my.cnf
Executable file
10
MySQL/config/my.cnf
Executable file
@ -0,0 +1,10 @@
|
||||
[mysqld]
|
||||
user=mysql
|
||||
default-storage-engine=INNODB
|
||||
character-set-server=utf8
|
||||
|
||||
[client]
|
||||
default-character-set=utf8
|
||||
|
||||
[mysql]
|
||||
default-character-set=utf8
|
||||
336
MySQL/docker-entrypoint-initdb.d/sims.sql
Executable file
336
MySQL/docker-entrypoint-initdb.d/sims.sql
Executable file
@ -0,0 +1,336 @@
|
||||
-- MySQL dump 10.13 Distrib 5.7.44, for Linux (x86_64)
|
||||
--
|
||||
-- Host: localhost Database: sims
|
||||
-- ------------------------------------------------------
|
||||
-- Server version 5.7.44
|
||||
|
||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
||||
/*!40101 SET NAMES utf8 */;
|
||||
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
||||
/*!40103 SET TIME_ZONE='+00:00' */;
|
||||
/*!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 */;
|
||||
|
||||
--
|
||||
-- Table structure for table `Student`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `Student`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `Student` (
|
||||
`SNo` int(11) NOT NULL,
|
||||
`SName` varchar(100) NOT NULL,
|
||||
`Gender` varchar(100) NOT NULL,
|
||||
`Birthday` date NOT NULL,
|
||||
`Mobile` varchar(100) NOT NULL,
|
||||
`Email` varchar(100) NOT NULL,
|
||||
`Address` varchar(500) NOT NULL,
|
||||
`Image` varchar(200) DEFAULT NULL,
|
||||
PRIMARY KEY (`SNo`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `Student`
|
||||
--
|
||||
|
||||
LOCK TABLES `Student` WRITE;
|
||||
/*!40000 ALTER TABLE `Student` DISABLE KEYS */;
|
||||
INSERT INTO `Student` VALUES (95001,'王进','男','2020-02-01','13900998877','wangjin@abc.com','江苏省南京市溧水区宝塔路11号','e8ec33473c6d16a19d280b8dc634758c.jpg'),(95002,'李四','女','1994-07-25','13462312498','lisi@sohu.com','上海市徐汇区漕宝路99弄',NULL),(95003,'陈鹏','男','1995-03-04','18987123123','chenpeng@163.com','上海市闵行区银都路294号',NULL),(95004,'张丽','男','1995-03-05','13482034096','zhangli@iLync.cn','上海市徐汇区习勤路100弄',NULL),(95005,'刘向东','女','1995-03-06','13787123123','liuxiangdong@iLync.cn','上海市闵行区春申路295号',NULL),(95006,'李明博','男','1995-03-07','18932178905','zhangzhiqiang@sina.com','上海市徐汇区柳州路101弄',NULL),(95007,'张子强','男','1995-03-08','17600715247','wwh@live.cn','上海市闵行区虹梅南路296号',NULL),(95008,'王文海','女','1995-03-09','18238391838','65212321@qq.com','上海市徐汇区龙漕路102弄',NULL),(95009,'刘慧娟','男','1995-03-10','18876068428','liuhuijuan@iLync.cn','上海市闵行区颛兴东路297号',NULL),(95010,'陈敏','女','1995-03-11','13513745019','chenming@sohu.com','上海市徐汇区桂林路103弄','dae3aa26a0c8cfa950e6cbb98425b9d8.jpg'),(95011,'王云','女','1995-03-12','13051421609','wangyun@gmail.com','上海市闵行区开发区大道298号','1fec845b4fc9065c249914047c2e32c7.jpg'),(95012,'沈璐','男','1995-03-13','13889098199','shenlu@iLync.cn','上海市徐汇区田东路104弄','8892f98a849bdcc06eece1738d47c2bf.jpg'),(95013,'赵鹏飞','男','1995-03-14','15026774790','chenpengfei@iLync.cn','上海市闵行区都市路99号','76c0581ba6f7c8d637f971be17848ef3.jpg'),(95014,'谢朝阳','女','1995-03-15','18064451380','xiechaoyang@sohu.com','上海市徐汇区钦州北路105弄',NULL),(95015,'刘子歌','男','1995-03-16','13902127970','6533422@qq.com','上海市闵行区都会路300号',NULL),(95016,'陈照升','男','1995-03-17','13339804561','chenzs@iLync.cn','上海市徐汇区中山北路106弄',NULL),(95017,'秦小路','女','1995-03-18','13477481151','qinxl@sina.com','上海市闵行区都庄路301号',NULL),(95018,'张大宝','男','1995-03-19','13915157742','zhangdb@sohu.com','上海市徐汇区桂林东街107弄',NULL),(95019,'刘佳','男','1995-03-20','13352834332','liujia@sohu.com','上海市闵行区剑川路302号',NULL),(95020,'李伟','女','1995-03-21','15990510922','lw@263.com','上海市徐汇区桂林西街108弄',NULL),(95021,'杨荣','男','1995-05-31','13522341234','yangrong@iLync.cn','江苏省泰州市姜堰区华港镇254号',NULL);
|
||||
/*!40000 ALTER TABLE `Student` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `auth_group`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `auth_group`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `auth_group` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(80) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `name` (`name`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `auth_group`
|
||||
--
|
||||
|
||||
LOCK TABLES `auth_group` WRITE;
|
||||
/*!40000 ALTER TABLE `auth_group` DISABLE KEYS */;
|
||||
/*!40000 ALTER TABLE `auth_group` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `auth_group_permissions`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `auth_group_permissions`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `auth_group_permissions` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`group_id` int(11) NOT NULL,
|
||||
`permission_id` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `auth_group_permissions_group_id_permission_id_0cd325b0_uniq` (`group_id`,`permission_id`),
|
||||
KEY `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` (`permission_id`),
|
||||
CONSTRAINT `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`),
|
||||
CONSTRAINT `auth_group_permissions_group_id_b120cbf9_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `auth_group_permissions`
|
||||
--
|
||||
|
||||
LOCK TABLES `auth_group_permissions` WRITE;
|
||||
/*!40000 ALTER TABLE `auth_group_permissions` DISABLE KEYS */;
|
||||
/*!40000 ALTER TABLE `auth_group_permissions` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `auth_permission`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `auth_permission`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `auth_permission` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(255) NOT NULL,
|
||||
`content_type_id` int(11) NOT NULL,
|
||||
`codename` varchar(100) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `auth_permission_content_type_id_codename_01ab375a_uniq` (`content_type_id`,`codename`),
|
||||
CONSTRAINT `auth_permission_content_type_id_2f476e4b_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `auth_permission`
|
||||
--
|
||||
|
||||
LOCK TABLES `auth_permission` WRITE;
|
||||
/*!40000 ALTER TABLE `auth_permission` DISABLE KEYS */;
|
||||
INSERT INTO `auth_permission` VALUES (1,'Can add log entry',1,'add_logentry'),(2,'Can change log entry',1,'change_logentry'),(3,'Can delete log entry',1,'delete_logentry'),(4,'Can view log entry',1,'view_logentry'),(5,'Can add permission',2,'add_permission'),(6,'Can change permission',2,'change_permission'),(7,'Can delete permission',2,'delete_permission'),(8,'Can view permission',2,'view_permission'),(9,'Can add group',3,'add_group'),(10,'Can change group',3,'change_group'),(11,'Can delete group',3,'delete_group'),(12,'Can view group',3,'view_group'),(13,'Can add user',4,'add_user'),(14,'Can change user',4,'change_user'),(15,'Can delete user',4,'delete_user'),(16,'Can view user',4,'view_user'),(17,'Can add content type',5,'add_contenttype'),(18,'Can change content type',5,'change_contenttype'),(19,'Can delete content type',5,'delete_contenttype'),(20,'Can view content type',5,'view_contenttype'),(21,'Can add session',6,'add_session'),(22,'Can change session',6,'change_session'),(23,'Can delete session',6,'delete_session'),(24,'Can view session',6,'view_session'),(25,'Can add student',7,'add_student'),(26,'Can change student',7,'change_student'),(27,'Can delete student',7,'delete_student'),(28,'Can view student',7,'view_student');
|
||||
/*!40000 ALTER TABLE `auth_permission` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `auth_user`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `auth_user`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `auth_user` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`password` varchar(128) NOT NULL,
|
||||
`last_login` datetime(6) DEFAULT NULL,
|
||||
`is_superuser` tinyint(1) NOT NULL,
|
||||
`username` varchar(150) NOT NULL,
|
||||
`first_name` varchar(30) NOT NULL,
|
||||
`last_name` varchar(150) NOT NULL,
|
||||
`email` varchar(254) NOT NULL,
|
||||
`is_staff` tinyint(1) NOT NULL,
|
||||
`is_active` tinyint(1) NOT NULL,
|
||||
`date_joined` datetime(6) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `username` (`username`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `auth_user`
|
||||
--
|
||||
|
||||
LOCK TABLES `auth_user` WRITE;
|
||||
/*!40000 ALTER TABLE `auth_user` DISABLE KEYS */;
|
||||
/*!40000 ALTER TABLE `auth_user` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `auth_user_groups`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `auth_user_groups`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `auth_user_groups` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`user_id` int(11) NOT NULL,
|
||||
`group_id` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `auth_user_groups_user_id_group_id_94350c0c_uniq` (`user_id`,`group_id`),
|
||||
KEY `auth_user_groups_group_id_97559544_fk_auth_group_id` (`group_id`),
|
||||
CONSTRAINT `auth_user_groups_group_id_97559544_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`),
|
||||
CONSTRAINT `auth_user_groups_user_id_6a12ed8b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `auth_user_groups`
|
||||
--
|
||||
|
||||
LOCK TABLES `auth_user_groups` WRITE;
|
||||
/*!40000 ALTER TABLE `auth_user_groups` DISABLE KEYS */;
|
||||
/*!40000 ALTER TABLE `auth_user_groups` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `auth_user_user_permissions`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `auth_user_user_permissions`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `auth_user_user_permissions` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`user_id` int(11) NOT NULL,
|
||||
`permission_id` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `auth_user_user_permissions_user_id_permission_id_14a6b632_uniq` (`user_id`,`permission_id`),
|
||||
KEY `auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm` (`permission_id`),
|
||||
CONSTRAINT `auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`),
|
||||
CONSTRAINT `auth_user_user_permissions_user_id_a95ead1b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `auth_user_user_permissions`
|
||||
--
|
||||
|
||||
LOCK TABLES `auth_user_user_permissions` WRITE;
|
||||
/*!40000 ALTER TABLE `auth_user_user_permissions` DISABLE KEYS */;
|
||||
/*!40000 ALTER TABLE `auth_user_user_permissions` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `django_admin_log`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `django_admin_log`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `django_admin_log` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`action_time` datetime(6) NOT NULL,
|
||||
`object_id` longtext,
|
||||
`object_repr` varchar(200) NOT NULL,
|
||||
`action_flag` smallint(5) unsigned NOT NULL,
|
||||
`change_message` longtext NOT NULL,
|
||||
`content_type_id` int(11) DEFAULT NULL,
|
||||
`user_id` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `django_admin_log_content_type_id_c4bce8eb_fk_django_co` (`content_type_id`),
|
||||
KEY `django_admin_log_user_id_c564eba6_fk_auth_user_id` (`user_id`),
|
||||
CONSTRAINT `django_admin_log_content_type_id_c4bce8eb_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`),
|
||||
CONSTRAINT `django_admin_log_user_id_c564eba6_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `django_admin_log`
|
||||
--
|
||||
|
||||
LOCK TABLES `django_admin_log` WRITE;
|
||||
/*!40000 ALTER TABLE `django_admin_log` DISABLE KEYS */;
|
||||
/*!40000 ALTER TABLE `django_admin_log` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `django_content_type`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `django_content_type`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `django_content_type` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`app_label` varchar(100) NOT NULL,
|
||||
`model` varchar(100) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `django_content_type_app_label_model_76bd3d3b_uniq` (`app_label`,`model`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `django_content_type`
|
||||
--
|
||||
|
||||
LOCK TABLES `django_content_type` WRITE;
|
||||
/*!40000 ALTER TABLE `django_content_type` DISABLE KEYS */;
|
||||
INSERT INTO `django_content_type` VALUES (1,'admin','logentry'),(3,'auth','group'),(2,'auth','permission'),(4,'auth','user'),(5,'contenttypes','contenttype'),(6,'sessions','session'),(7,'sims','student');
|
||||
/*!40000 ALTER TABLE `django_content_type` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `django_migrations`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `django_migrations`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `django_migrations` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`app` varchar(255) NOT NULL,
|
||||
`name` varchar(255) NOT NULL,
|
||||
`applied` datetime(6) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `django_migrations`
|
||||
--
|
||||
|
||||
LOCK TABLES `django_migrations` WRITE;
|
||||
/*!40000 ALTER TABLE `django_migrations` DISABLE KEYS */;
|
||||
INSERT INTO `django_migrations` VALUES (1,'contenttypes','0001_initial','2024-12-20 08:26:13.110217'),(2,'auth','0001_initial','2024-12-20 08:26:14.077220'),(3,'admin','0001_initial','2024-12-20 08:26:14.310216'),(4,'admin','0002_logentry_remove_auto_add','2024-12-20 08:26:14.325216'),(5,'admin','0003_logentry_add_action_flag_choices','2024-12-20 08:26:14.347215'),(6,'contenttypes','0002_remove_content_type_name','2024-12-20 08:26:14.477216'),(7,'auth','0002_alter_permission_name_max_length','2024-12-20 08:26:14.550215'),(8,'auth','0003_alter_user_email_max_length','2024-12-20 08:26:14.586216'),(9,'auth','0004_alter_user_username_opts','2024-12-20 08:26:14.601214'),(10,'auth','0005_alter_user_last_login_null','2024-12-20 08:26:14.669215'),(11,'auth','0006_require_contenttypes_0002','2024-12-20 08:26:14.681214'),(12,'auth','0007_alter_validators_add_error_messages','2024-12-20 08:26:14.696217'),(13,'auth','0008_alter_user_username_max_length','2024-12-20 08:26:14.770216'),(14,'auth','0009_alter_user_last_name_max_length','2024-12-20 08:26:14.841235'),(15,'sessions','0001_initial','2024-12-20 08:26:14.930216'),(16,'sims','0001_initial','2024-12-20 08:26:15.037217');
|
||||
/*!40000 ALTER TABLE `django_migrations` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `django_session`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `django_session`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `django_session` (
|
||||
`session_key` varchar(40) NOT NULL,
|
||||
`session_data` longtext NOT NULL,
|
||||
`expire_date` datetime(6) NOT NULL,
|
||||
PRIMARY KEY (`session_key`),
|
||||
KEY `django_session_expire_date_a5c62663` (`expire_date`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `django_session`
|
||||
--
|
||||
|
||||
LOCK TABLES `django_session` WRITE;
|
||||
/*!40000 ALTER TABLE `django_session` DISABLE KEYS */;
|
||||
/*!40000 ALTER TABLE `django_session` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
||||
|
||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
||||
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
||||
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
||||
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
||||
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
||||
|
||||
-- Dump completed on 2024-12-26 16:58:05
|
||||
18
README.md
Executable file
18
README.md
Executable file
@ -0,0 +1,18 @@
|
||||
## 环境信息
|
||||
|
||||
Python版本:Python 3.7
|
||||
|
||||
Django版本:2.1.4
|
||||
|
||||
Vue版本:2.6.11
|
||||
|
||||
Element版本:2.13.0
|
||||
|
||||
数据库:MySQL 5.7
|
||||
|
||||
|
||||
|
||||
后端编辑器:PyCharm
|
||||
|
||||
前端编辑器:VS code 插件:`Vue 2 Snippets` + `Live Server`
|
||||
|
||||
0
apps/__init__.py
Executable file
0
apps/__init__.py
Executable file
2
apps/sims/__init__.py
Executable file
2
apps/sims/__init__.py
Executable file
@ -0,0 +1,2 @@
|
||||
import pymysql
|
||||
pymysql.install_as_MySQLdb()
|
||||
BIN
apps/sims/__pycache__/__init__.cpython-37.pyc
Executable file
BIN
apps/sims/__pycache__/__init__.cpython-37.pyc
Executable file
Binary file not shown.
BIN
apps/sims/__pycache__/admin.cpython-37.pyc
Executable file
BIN
apps/sims/__pycache__/admin.cpython-37.pyc
Executable file
Binary file not shown.
BIN
apps/sims/__pycache__/models.cpython-37.pyc
Executable file
BIN
apps/sims/__pycache__/models.cpython-37.pyc
Executable file
Binary file not shown.
BIN
apps/sims/__pycache__/views.cpython-37.pyc
Executable file
BIN
apps/sims/__pycache__/views.cpython-37.pyc
Executable file
Binary file not shown.
3
apps/sims/admin.py
Executable file
3
apps/sims/admin.py
Executable file
@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
5
apps/sims/apps.py
Executable file
5
apps/sims/apps.py
Executable file
@ -0,0 +1,5 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class SimsConfig(AppConfig):
|
||||
name = 'apps.sims'
|
||||
31
apps/sims/migrations/0001_initial.py
Executable file
31
apps/sims/migrations/0001_initial.py
Executable file
@ -0,0 +1,31 @@
|
||||
# Generated by Django 2.1.4 on 2024-12-20 08:23
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Student',
|
||||
fields=[
|
||||
('sno', models.IntegerField(db_column='SNo', primary_key=True, serialize=False)),
|
||||
('name', models.CharField(db_column='SName', max_length=100)),
|
||||
('gender', models.CharField(choices=[('男', '男'), ('女', '女')], db_column='Gender', max_length=100)),
|
||||
('birthday', models.DateField(db_column='Birthday')),
|
||||
('mobile', models.CharField(db_column='Mobile', max_length=100)),
|
||||
('email', models.CharField(db_column='Email', max_length=100)),
|
||||
('address', models.CharField(db_column='Address', max_length=500)),
|
||||
('image', models.CharField(db_column='Image', max_length=200, null=True)),
|
||||
],
|
||||
options={
|
||||
'db_table': 'Student',
|
||||
'managed': True,
|
||||
},
|
||||
),
|
||||
]
|
||||
0
apps/sims/migrations/__init__.py
Executable file
0
apps/sims/migrations/__init__.py
Executable file
BIN
apps/sims/migrations/__pycache__/0001_initial.cpython-37.pyc
Executable file
BIN
apps/sims/migrations/__pycache__/0001_initial.cpython-37.pyc
Executable file
Binary file not shown.
BIN
apps/sims/migrations/__pycache__/__init__.cpython-37.pyc
Executable file
BIN
apps/sims/migrations/__pycache__/__init__.cpython-37.pyc
Executable file
Binary file not shown.
27
apps/sims/models.py
Executable file
27
apps/sims/models.py
Executable file
@ -0,0 +1,27 @@
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
# student: 学号,姓名,性别,出生日期,手机号码,邮箱地址,家庭住址,照片
|
||||
|
||||
|
||||
# 创建一个类,类属性映射表字段
|
||||
class Student(models.Model):
|
||||
gender_choices = (('男','男'),('女','女'))
|
||||
sno = models.IntegerField(db_column="SNo", primary_key=True, null=False) # 学号,不允许为空,主键
|
||||
name = models.CharField(db_column="SName", max_length=100, null=False) # 姓名,最长100个字符,不允许为空
|
||||
gender = models.CharField(db_column="Gender",max_length=100,choices=gender_choices) # 性别,选项选择
|
||||
birthday = models.DateField(db_column="Birthday", null=False) # 出生日期,不允许为空
|
||||
mobile = models.CharField(db_column="Mobile", max_length=100) # 手机号码,
|
||||
email = models.CharField(db_column="Email",max_length=100) # 邮箱地址
|
||||
address = models.CharField(db_column="Address",max_length=500) # 家庭住址
|
||||
image = models.CharField(db_column="Image", max_length=200,null=True) # 照片
|
||||
|
||||
# 在默认情况下,生成的表名:App_class, 如果要自定义 ,需要使用Class Meta来自定义
|
||||
class Meta:
|
||||
managed = True
|
||||
db_table = "Student"
|
||||
|
||||
# __str__方法
|
||||
def __str__(self):
|
||||
return "学号:%s\t姓名:%s\t性别:%s" %(self.sno,self.name,self.gender)
|
||||
|
||||
3
apps/sims/tests.py
Executable file
3
apps/sims/tests.py
Executable file
@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
323
apps/sims/views.py
Executable file
323
apps/sims/views.py
Executable file
@ -0,0 +1,323 @@
|
||||
from django.shortcuts import render
|
||||
# 引入 Student 的类
|
||||
from sims.models import Student
|
||||
# 引入 JsonResponse 模块
|
||||
from django.http import JsonResponse
|
||||
# 导入 json 模块
|
||||
import json
|
||||
# 导入 Q 查询
|
||||
from django.db.models import Q
|
||||
# 导入 uuid 类
|
||||
import uuid
|
||||
# 导入哈希库
|
||||
import hashlib
|
||||
# 导入setting
|
||||
from django.conf import settings
|
||||
# 导入os
|
||||
import os
|
||||
# 导入 openpyxl
|
||||
import openpyxl
|
||||
|
||||
|
||||
# Create your views here.
|
||||
|
||||
|
||||
def get_students(request):
|
||||
"""" 获取所有学生的信息 """
|
||||
try:
|
||||
# 使用 ORM 获取所有学生信息
|
||||
obj_students = Student.objects.all().values()
|
||||
# 把结果转为 List
|
||||
students = list(obj_students)
|
||||
# 返回
|
||||
return JsonResponse({'code': 1, 'data': students})
|
||||
except Exception as e:
|
||||
# 如果出现异常返回
|
||||
return JsonResponse({'code': 0, 'msg': "获取学生信息出现异常:" + str(e)})
|
||||
|
||||
|
||||
def query_students(request):
|
||||
"""" 查询学生的信息 """
|
||||
# 接收传递过来的关键字 --- axios默认是json --- 转换为字典类型('inputstr') --- data['inputstr']
|
||||
data = json.loads(request.body.decode('utf-8'))
|
||||
try:
|
||||
# 使用ORM获取满足条件的学生信息 并把对象转为字典格式
|
||||
obj_students = Student.objects.filter(Q(sno__icontains=data['inputstr']) | Q(name__icontains=data['inputstr']) |
|
||||
Q(gender__icontains=data['inputstr']) | Q(
|
||||
mobile__icontains=data['inputstr'])
|
||||
| Q(email__icontains=data['inputstr']) | Q(
|
||||
address__icontains=data['inputstr'])).values()
|
||||
# 把结果转为 List
|
||||
students = list(obj_students)
|
||||
# 返回
|
||||
return JsonResponse({'code': 1, 'data': students})
|
||||
except Exception as e:
|
||||
# 如果出现异常返回
|
||||
return JsonResponse({'code': 0, 'msg': "获取学生信息出现异常:" + str(e)})
|
||||
|
||||
|
||||
def is_exists_sno(request):
|
||||
"""判断学号是否存在"""
|
||||
# 接收传递过来的学号
|
||||
data = json.loads(request.body.decode('utf-8'))
|
||||
try:
|
||||
obj_students = Student.objects.filter(sno=data['sno'])
|
||||
if obj_students.count() == 0:
|
||||
return JsonResponse({'code': 1, 'exists': False})
|
||||
else:
|
||||
return JsonResponse({'code': 1, 'exists': True})
|
||||
except Exception as e:
|
||||
return JsonResponse({'code': 0, 'msg': "校验学号失败,失败原因:" + str(e)})
|
||||
|
||||
|
||||
def add_student(request):
|
||||
"""" 添加学生信息到数据库 """
|
||||
# 接收传递过来的值
|
||||
data = json.loads(request.body.decode('utf-8'))
|
||||
try:
|
||||
# 添加到数据库
|
||||
obj_student = Student(sno=data['sno'],
|
||||
name=data['name'],
|
||||
gender=data['gender'],
|
||||
birthday=data['birthday'],
|
||||
mobile=data['mobile'],
|
||||
email=data['email'],
|
||||
address=data['address'],
|
||||
image=data['image']
|
||||
)
|
||||
# 执行添加
|
||||
obj_student.save()
|
||||
|
||||
# 使用 ORM 获取所有学生信息
|
||||
obj_students = Student.objects.all().values()
|
||||
# 把结果转为 List
|
||||
students = list(obj_students)
|
||||
# 返回
|
||||
return JsonResponse({'code': 1, 'data': students})
|
||||
except Exception as e:
|
||||
# 如果出现异常返回
|
||||
return JsonResponse({'code': 0, 'msg': "添加学生信息到数据库出现异常,原因如下:" + str(e)})
|
||||
|
||||
|
||||
def update_student(request):
|
||||
"""" 更新学生信息到数据库 """
|
||||
# 接收传递过来的值
|
||||
data = json.loads(request.body.decode('utf-8'))
|
||||
try:
|
||||
# 查找到要修改的学生信息
|
||||
obj_student = Student.objects.get(sno=data['sno'])
|
||||
# 依次修改
|
||||
obj_student.name = data['name']
|
||||
obj_student.gender = data['gender']
|
||||
obj_student.birthday = data['birthday']
|
||||
obj_student.mobile = data['mobile']
|
||||
obj_student.email = data['email']
|
||||
obj_student.address = data['address']
|
||||
obj_student.image = data['image']
|
||||
# 保存
|
||||
obj_student.save()
|
||||
|
||||
# 使用 ORM 获取所有学生信息
|
||||
obj_students = Student.objects.all().values()
|
||||
# 把结果转为 List
|
||||
students = list(obj_students)
|
||||
# 返回
|
||||
return JsonResponse({'code': 1, 'data': students})
|
||||
except Exception as e:
|
||||
# 如果出现异常返回
|
||||
return JsonResponse({'code': 0, 'msg': "修改学生信息到数据库出现异常,原因如下:" + str(e)})
|
||||
|
||||
|
||||
def delete_student(request):
|
||||
"""" 删除一条学生信息 """
|
||||
# 接收传递过来的值
|
||||
data = json.loads(request.body.decode('utf-8'))
|
||||
try:
|
||||
# 查找到要删除的学生信息
|
||||
obj_student = Student.objects.get(sno=data['sno'])
|
||||
# 删除
|
||||
obj_student.delete();
|
||||
|
||||
# 使用 ORM 获取所有学生信息
|
||||
obj_students = Student.objects.all().values()
|
||||
# 把结果转为 List
|
||||
students = list(obj_students)
|
||||
# 返回
|
||||
return JsonResponse({'code': 1, 'data': students})
|
||||
except Exception as e:
|
||||
# 如果出现异常返回
|
||||
return JsonResponse({'code': 0, 'msg': "删除学生信息写入数据库出现异常,原因如下:" + str(e)})
|
||||
|
||||
|
||||
def delete_students(request):
|
||||
"""" 批量删除学生信息 """
|
||||
# 接收传递过来的值
|
||||
data = json.loads(request.body.decode('utf-8'))
|
||||
try:
|
||||
# 遍历传递的集合
|
||||
for one_student in data['student']:
|
||||
# 查询当前记录
|
||||
obj_student = Student.objects.get(sno=one_student['sno'])
|
||||
# 执行删除
|
||||
obj_student.delete()
|
||||
# 获取最后的结果
|
||||
# 使用 ORM 获取所有学生信息
|
||||
obj_students = Student.objects.all().values()
|
||||
# 把结果转为 List
|
||||
students = list(obj_students)
|
||||
# 返回
|
||||
return JsonResponse({'code': 1, 'data': students})
|
||||
except Exception as e:
|
||||
# 如果出现异常返回
|
||||
return JsonResponse({'code': 0, 'msg': "批量删除学生信息写入数据库出现异常,原因如下:" + str(e)})
|
||||
|
||||
|
||||
def upload(request):
|
||||
"""接收上传的文件"""
|
||||
# 接收上传的文件
|
||||
rev_file = request.FILES.get('avatar')
|
||||
# 判断,是否有文件
|
||||
if not rev_file:
|
||||
return JsonResponse({'code': 0, 'msg': '图片不存在!'})
|
||||
# 获得一个唯一的名字: uuid +hash
|
||||
new_name = get_random_str()
|
||||
# 准备写入的URL
|
||||
file_path = os.path.join(settings.MEDIA_ROOT, new_name + os.path.splitext(rev_file.name)[1])
|
||||
# 开始写入到本次磁盘
|
||||
try:
|
||||
f = open(file_path, 'wb')
|
||||
# 多次写入
|
||||
for i in rev_file.chunks():
|
||||
f.write(i)
|
||||
# 要关闭
|
||||
f.close()
|
||||
# 返回
|
||||
return JsonResponse({'code': 1, 'name': new_name + os.path.splitext(rev_file.name)[1]})
|
||||
|
||||
except Exception as e:
|
||||
return JsonResponse({'code': 0, 'msg': str(e)})
|
||||
|
||||
|
||||
def get_random_str():
|
||||
# 获取uuid的随机数
|
||||
uuid_val = uuid.uuid4()
|
||||
# 获取uuid的随机数字符串
|
||||
uuid_str = str(uuid_val).encode('utf-8')
|
||||
# 获取md5实例
|
||||
md5 = hashlib.md5()
|
||||
# 拿取uuid的md5摘要
|
||||
md5.update(uuid_str)
|
||||
# 返回固定长度的字符串
|
||||
return md5.hexdigest()
|
||||
|
||||
|
||||
def import_students_excel(request):
|
||||
""" 从 excel 批量导入学生信息 """
|
||||
# 1. 接收 excel 文件存储到 Media 文件夹
|
||||
rev_file = request.FILES.get('excel')
|
||||
# 判断,是否有文件
|
||||
if not rev_file:
|
||||
return JsonResponse({'code': 0, 'msg': 'excel文件不存在!'})
|
||||
# 获得一个唯一的名字: uuid +hash
|
||||
new_name = get_random_str()
|
||||
# 准备写入的URL
|
||||
file_path = os.path.join(settings.MEDIA_ROOT, new_name + os.path.splitext(rev_file.name)[1])
|
||||
# 开始写入到本次磁盘
|
||||
try:
|
||||
f = open(file_path, 'wb')
|
||||
# 多次写入
|
||||
for i in rev_file.chunks():
|
||||
f.write(i)
|
||||
# 要关闭
|
||||
f.close()
|
||||
except Exception as e:
|
||||
return JsonResponse({'code': 0, 'msg': str(e)})
|
||||
# 2. 读取存储在 Media 的文件
|
||||
ex_students = read_excel_dict(file_path)
|
||||
# 3. 把读取的数据存储到数据库
|
||||
success = 0
|
||||
error = 0
|
||||
error_snos = []
|
||||
|
||||
# 开始遍历
|
||||
for one_student in ex_students:
|
||||
try:
|
||||
obj_student = Student.objects.create(sno=one_student['sno'],
|
||||
name=one_student['name'],
|
||||
gender=one_student['gender'],
|
||||
birthday=one_student['birthday'],
|
||||
mobile=one_student['mobile'],
|
||||
email=one_student['email'],
|
||||
address=one_student['address'])
|
||||
# 保存
|
||||
obj_student.save()
|
||||
# 计数
|
||||
success += 1
|
||||
except:
|
||||
# 如果失败了
|
||||
error += 1
|
||||
error_snos.append(one_student['sno'])
|
||||
|
||||
# 4. 返回导入的信息
|
||||
obj_student = Student.objects.all().values()
|
||||
students = list(obj_student)
|
||||
return JsonResponse({'code':1, 'success': success, 'error': error, 'errors': error_snos, 'data': students})
|
||||
|
||||
|
||||
def write_to_excel(data:list, path:str):
|
||||
"""把数据库写入到Excel"""
|
||||
# 实例化一个workbook
|
||||
workbook = openpyxl.Workbook()
|
||||
# 激活一个sheet
|
||||
sheet = workbook.active
|
||||
# 为sheet命名
|
||||
sheet.title = 'student'
|
||||
# 准备keys
|
||||
keys = data[0].keys()
|
||||
# 准备写入数据
|
||||
for index, item in enumerate(data):
|
||||
# 遍历每一个元素
|
||||
for k,v in enumerate(keys):
|
||||
sheet.cell(row=index + 1, column=k+ 1, value=str(item[v]))
|
||||
# 写入到文件
|
||||
workbook.save(path)
|
||||
|
||||
|
||||
def read_excel_dict(path: str):
|
||||
""" 读取 Excel 文件存储为字典"""
|
||||
# 实例化一个workbook
|
||||
workbook = openpyxl.load_workbook(path)
|
||||
# 实例化一个sheet
|
||||
sheet = workbook['student']
|
||||
# 定义一个变量存储最终的数据
|
||||
students = []
|
||||
# 准备key
|
||||
keys = ['sno', 'name', 'gender', 'birthday', 'mobile', 'email', 'address']
|
||||
# 遍历
|
||||
for row in sheet.rows:
|
||||
# 定义一个临时字典
|
||||
temp_dict = {}
|
||||
# 组合值和key
|
||||
for index, cell in enumerate(row):
|
||||
# 组合
|
||||
temp_dict[keys[index]] = cell.value
|
||||
# 附加到 list 中
|
||||
students.append(temp_dict)
|
||||
# 返回
|
||||
return students
|
||||
|
||||
|
||||
def export_students_excel(request):
|
||||
"""到处数据到excel"""
|
||||
# 获取所有的学生信息
|
||||
obj_students = Student.objects.all().values()
|
||||
# 转为List
|
||||
students = list(obj_students)
|
||||
# 准备名称
|
||||
excel_name = get_random_str() + ".xlsx"
|
||||
# 准备写入的路劲
|
||||
path = os.path.join(settings.MEDIA_ROOT, excel_name)
|
||||
# 写入到Excel
|
||||
write_to_excel(students, path)
|
||||
# 返回
|
||||
return JsonResponse({'code':1, 'name':excel_name })
|
||||
0
db.sqlite3
Executable file
0
db.sqlite3
Executable file
71
docker-compose.yml
Executable file
71
docker-compose.yml
Executable file
@ -0,0 +1,71 @@
|
||||
version: '3'
|
||||
services:
|
||||
simsdb:
|
||||
image: registry.cn-hangzhou.aliyuncs.com/hzbb/mysql:5.7.44
|
||||
restart: always
|
||||
container_name: simsdb
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
MYSQL_DATABASE: sims
|
||||
MYSQL_USER: test
|
||||
MYSQL_PASSWORD: admin@123456
|
||||
MYSQL_ROOT_PASSWORD: admin@123456
|
||||
ports:
|
||||
- 3306:3306
|
||||
volumes:
|
||||
- ./MySQL/data:/var/lib/mysql
|
||||
- ./MySQL/config/my.cnf:/etc/mysql/my.cnf
|
||||
- ./MySQL/mysql-files:/var/lib/mysql-files
|
||||
- ./MySQL/docker-entrypoint-initdb.d/:/docker-entrypoint-initdb.d/
|
||||
command:
|
||||
--max_connections=1000
|
||||
--character-set-server=utf8mb4
|
||||
--collation-server=utf8mb4_general_ci
|
||||
--default-authentication-plugin=mysql_native_password
|
||||
|
||||
simsbe:
|
||||
image: registry.cn-hangzhou.aliyuncs.com/hzbb/python:3.7.0
|
||||
restart: always
|
||||
hostname: simsbe
|
||||
container_name: simsbe
|
||||
volumes:
|
||||
- ./:/simsBE
|
||||
- ./module:/module
|
||||
depends_on:
|
||||
- simsdb
|
||||
environment:
|
||||
- TZ=Asia/Shanghai
|
||||
command: bash /module/run.sh
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://127.0.0.1:8000/students/"]
|
||||
interval: 20s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
start_period: 10s
|
||||
|
||||
simsfe:
|
||||
image: registry.cn-hangzhou.aliyuncs.com/hzbb/nginx:1.26.0
|
||||
restart: always
|
||||
container_name: simsfe
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
ports:
|
||||
- 80:80
|
||||
- 443:443
|
||||
depends_on:
|
||||
- simsbe
|
||||
- simsdb
|
||||
volumes:
|
||||
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
|
||||
- ./nginx/conf.d:/etc/nginx/conf.d
|
||||
- ./nginx/cert:/etc/nginx/cert
|
||||
- ./front:/simsFE
|
||||
|
||||
autoheal:
|
||||
image: registry.cn-hangzhou.aliyuncs.com/hzbb/autoheal:1.2.0
|
||||
restart: always
|
||||
container_name: sims-autoheal
|
||||
environment:
|
||||
- AUTOHEAL_CONTAINER_LABEL=all
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
2
front/cdn/axios.min.js
vendored
Executable file
2
front/cdn/axios.min.js
vendored
Executable file
File diff suppressed because one or more lines are too long
6
front/cdn/vue.min.js
vendored
Executable file
6
front/cdn/vue.min.js
vendored
Executable file
File diff suppressed because one or more lines are too long
71
front/css/index.css
Executable file
71
front/css/index.css
Executable file
@ -0,0 +1,71 @@
|
||||
html,body,#app,.el-container{
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.el-header {
|
||||
background-color: #B3C0D1;
|
||||
color: #333;
|
||||
text-align: left;
|
||||
line-height: 80px;
|
||||
font-size: 30px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.el-footer {
|
||||
background-color: #B3C0D1;
|
||||
color: #333;
|
||||
text-align: center;
|
||||
line-height: 30px;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.el-aside {
|
||||
background-color: #D3DCE6;
|
||||
color: #333;
|
||||
text-align: center;
|
||||
line-height: 200px;
|
||||
}
|
||||
|
||||
.el-main {
|
||||
background-color: #E9EEF3;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
body > .el-container {
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
|
||||
.el-container:nth-child(5) .el-aside,
|
||||
.el-container:nth-child(6) .el-aside {
|
||||
line-height: 260px;
|
||||
}
|
||||
|
||||
.el-container:nth-child(7) .el-aside {
|
||||
line-height: 320px;
|
||||
}
|
||||
|
||||
.el-dialog .avatar-uploader .el-upload {
|
||||
border: 1px dashed #d9d9d9;
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
.el-dialog .avatar-uploader .el-upload:hover {
|
||||
border-color: #409EFF;
|
||||
}
|
||||
.el-dialog .avatar-uploader-icon {
|
||||
font-size: 28px;
|
||||
color: #8c939d;
|
||||
width: 178px;
|
||||
height: 178px;
|
||||
line-height: 178px;
|
||||
text-align: center;
|
||||
}
|
||||
.el-dialog .avatar {
|
||||
width: 178px;
|
||||
height: 178px;
|
||||
display: block;
|
||||
}
|
||||
175
front/index.html
Executable file
175
front/index.html
Executable file
@ -0,0 +1,175 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>学生信息管理系统</title>
|
||||
<!-- 引入外部样式 -->
|
||||
<link rel="stylesheet" href="./css/index.css">
|
||||
<!-- 使用CDN引入 Vue 模块 -->
|
||||
<!-- <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script> -->
|
||||
<script src="./cdn/vue.min.js"></script>
|
||||
<!-- 使用CDN引入 Element UI 样式 -->
|
||||
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
|
||||
<!-- 使用CDN引入 Element UI 组件库 -->
|
||||
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
|
||||
<!-- 引入 Axios 组件库 -->
|
||||
<!-- <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> -->
|
||||
<script src="./cdn/axios.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="app">
|
||||
<el-container>
|
||||
<el-header style="height: 80px;">学生信息管理系统</el-header>
|
||||
<el-container>
|
||||
<el-aside width="200px">
|
||||
<el-menu default-active="2" class="el-menu-vertical-demo">
|
||||
<el-menu-item index="1">
|
||||
<i class="el-icon-menu"></i>
|
||||
<span slot="title">班级管理</span>
|
||||
</el-menu-item>
|
||||
<el-menu-item index="2">
|
||||
<i class="el-icon-user"></i>
|
||||
<span slot="title">学生信息</span>
|
||||
</el-menu-item>
|
||||
<el-menu-item index="3">
|
||||
<i class="el-icon-s-custom"></i>
|
||||
<span slot="title">讲师信息</span>
|
||||
</el-menu-item>
|
||||
<el-menu-item index="4">
|
||||
<i class="el-icon-date"></i>
|
||||
<span slot="title">课程管理</span>
|
||||
</el-menu-item>
|
||||
</el-menu>
|
||||
</el-aside>
|
||||
<el-container>
|
||||
<el-main>
|
||||
<!-- 面包屑导航 -->
|
||||
<el-breadcrumb separator-class="el-icon-arrow-right">
|
||||
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
|
||||
<el-breadcrumb-item>学生管理</el-breadcrumb-item>
|
||||
</el-breadcrumb>
|
||||
<!-- 表单 -->
|
||||
<el-form :inline="true" style="margin-top: 20px;">
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="请输入查询的关键字:">
|
||||
<el-input v-model="inputStr" placeholder="输入查询的关键字" style="width: 360px;"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8" style="text-align: right; padding-right: 40px;">
|
||||
<el-button type="primary" icon="el-icon-search" @click="queryStudents()">查询</el-button>
|
||||
<el-button type="primary" icon="el-icon-tickets" @click="getAllStudents()">全部</el-button>
|
||||
<el-button type="primary" icon="el-icon-plus" @click="addStudent()">添加</el-button>
|
||||
</el-col>
|
||||
<el-col :span="2" style="text-align: right; padding-right: 10px;">
|
||||
<el-upload :show-file-list="false" :http-request="uploadExcelPost">
|
||||
<el-button type="primary" >导入Excel</el-button>
|
||||
</el-upload>
|
||||
</el-col>
|
||||
<el-col :span="2">
|
||||
<el-button type="primary" @click="exportToExcel()">导出Excel</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<!-- 表格 -->
|
||||
<el-table :data="pageStudents" border style="width: 100%" @selection-change="handleSelectionChange">
|
||||
<el-table-column :resizable="false" type="selection">
|
||||
</el-table-column>
|
||||
<el-table-column :resizable="false" type="index" label="序号" align="center" width="60">
|
||||
</el-table-column>
|
||||
<el-table-column :resizable="false" prop="sno" label="学号" align="center" width="120">
|
||||
</el-table-column>
|
||||
<el-table-column :resizable="false" prop="name" label="姓名" align="center" align="center" width="120">
|
||||
</el-table-column>
|
||||
<el-table-column :resizable="false" prop="gender" label="性别" align="center" width="60">
|
||||
</el-table-column>
|
||||
<el-table-column :resizable="false" prop="birthday" label="出生日期" align="center" width="120">
|
||||
</el-table-column>
|
||||
<el-table-column :resizable="false" prop="mobile" label="电话号码" align="center" width="160">
|
||||
</el-table-column>
|
||||
<el-table-column :resizable="false" prop="email" label="邮箱" align="center" width="300">
|
||||
</el-table-column>
|
||||
<el-table-column :resizable="false" prop="address" label="地址" align="center">
|
||||
</el-table-column>
|
||||
<el-table-column :resizable="false" label="操作" align="center" width="180">
|
||||
<template slot-scope="scope">
|
||||
<el-button type="success" icon="el-icon-more" size="mini" @click="viewStudent(scope.row)" circle>
|
||||
</el-button>
|
||||
<el-button type="primary" icon="el-icon-edit" size="mini" @click="updateStudent(scope.row)" circle>
|
||||
</el-button>
|
||||
<el-button type="danger" icon="el-icon-delete" size="mini" @click="deleteStudent(scope.row)" circle>
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 分页 -->
|
||||
<el-row style="margin-top: 20px;">
|
||||
<el-col :span="8" style="text-align: left;">
|
||||
<el-button type="danger" icon="el-icon-delete" size="mini" @click="deleteStudents">批量删除</el-button>
|
||||
</el-col>
|
||||
<el-col :span="16" style="text-align:right;">
|
||||
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
|
||||
:current-page="currentpage" :page-sizes="[5, 10, 50, 100]" :page-size="pagesize"
|
||||
layout="total, sizes, prev, pager, next, jumper" :total="total">
|
||||
</el-pagination>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<!-- 弹出框学生明细 -->
|
||||
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="40%" :close-on-click-modal="false"
|
||||
@close="closeDialogForm('studentForm')">
|
||||
<el-form :model="studentForm" ref="studentForm" :rules="rules" :inline="true" style="margin-left: 24px;"
|
||||
label-width="110px" label-position="right" size="mini">
|
||||
<el-upload class="avatar-uploader"
|
||||
:show-file-list="false" :http-request="uploadPicturePost" style=" text-align: center; margin: 20px;">
|
||||
<img v-if="studentForm.image" :src="studentForm.imageUrl" class="avatar">
|
||||
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
|
||||
</el-upload>
|
||||
<el-form-item label="学号:" prop="sno">
|
||||
<el-input v-model="studentForm.sno" :disabled="isView || isEdit" suffix-icon="el-icon-edit">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="姓名:" prop="name">
|
||||
<el-input v-model="studentForm.name" :disabled="isView" suffix-icon="el-icon-edit"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="性别:" prop="gender">
|
||||
<el-select v-model="studentForm.gender" :disabled="isView" placeholder="请选择性别">
|
||||
<el-option label="男" value="男"></el-option>
|
||||
<el-option label="女" value="女"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="出生日期:" prop="birthday">
|
||||
<el-date-picker v-model="studentForm.birthday" type="date" value-format="yyyy-MM-dd"
|
||||
placeholder="选择日期" :disabled="isView" style="width: 93%;">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="手机号码:" prop="mobile">
|
||||
<el-input v-model="studentForm.mobile" :disabled="isView" suffix-icon="el-icon-edit"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="邮箱地址:" prop="email">
|
||||
<el-input v-model="studentForm.email" :disabled="isView" suffix-icon="el-icon-edit"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="家庭住址:" prop="address">
|
||||
<el-input v-model="studentForm.address" :disabled="isView" suffix-icon="el-icon-edit"
|
||||
style="width: 264%;"></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" @click="submitStudentForm('studentForm')" v-show="!isView">确定</el-button>
|
||||
<el-button type="info" @click="closeDialogForm('studentForm')">取消</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</el-main>
|
||||
<el-footer style="height: 30px;">学生信息管理系统 版权所有: Hzbb | 2024-12-20 </el-footer>
|
||||
</el-container>
|
||||
</el-container>
|
||||
</el-container>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
<!-- 引入Vue代码 -->
|
||||
<script src="js/index.js"></script>
|
||||
531
front/js/index.js
Executable file
531
front/js/index.js
Executable file
@ -0,0 +1,531 @@
|
||||
const app = new Vue({
|
||||
el: '#app',
|
||||
data() {
|
||||
// 校验学号是否存在
|
||||
const rulesSno = (rule, value, callback) => {
|
||||
if (this.isEdit) {
|
||||
callback();
|
||||
}
|
||||
// 使用 Axios 进行校验
|
||||
axios
|
||||
.post(
|
||||
this.baseURL + 'sno/check/',
|
||||
{
|
||||
sno: value,
|
||||
}
|
||||
)
|
||||
.then((res) => {
|
||||
if (res.data.code === 1) {
|
||||
// 请求成功
|
||||
if (res.data.exists) {
|
||||
callback(new Error("学号已存在"));
|
||||
} else {
|
||||
callback();
|
||||
};
|
||||
} else {
|
||||
// 请求失败
|
||||
callback(new Error("校验学号后端出现异常"));
|
||||
};
|
||||
})
|
||||
.catch((err) => {
|
||||
// 如果请求失败在控制台打印
|
||||
console.log(err);
|
||||
})
|
||||
}
|
||||
return {
|
||||
students: [], // 所有学生信息
|
||||
pageStudents: [], // 分页后当前页的学生信息
|
||||
// baseURL: "http://172.29.89.96/",
|
||||
baseURL: window.location.origin + '/', // 动态获取请求的url
|
||||
inputStr: '', // 输入查询的关键字
|
||||
selectStudents: [], // 选择复选框时把选择记录存在此集合
|
||||
|
||||
// === 分页相关的变量 ===
|
||||
total: 0, // 数据总行数
|
||||
currentpage: 1, // 当前所在的页
|
||||
pagesize: 10, // 每页显示多少行
|
||||
// === 弹出框表单 ===
|
||||
dialogVisible: false, // 默认为不弹出状态
|
||||
dialogTitle: false, // 弹出框标题默认为空
|
||||
isView: false, // 标识是否是查看
|
||||
isEdit: false, // 标识是否是编辑
|
||||
// 添加默认空集合
|
||||
studentForm: {
|
||||
sno: '',
|
||||
name: '',
|
||||
gender: '',
|
||||
birthday: '',
|
||||
mobile: '',
|
||||
email: '',
|
||||
address: '',
|
||||
image: '',
|
||||
imageUrl: '',
|
||||
},
|
||||
// 弹出框输入校验
|
||||
rules: {
|
||||
sno: [
|
||||
{ required: true, message: "学号不能为空", trigger: 'blur' },
|
||||
{ pattern: /^[9][5]\d{3}$/, message: "学号必须是95开头的五位数字", trigger: 'blur' },
|
||||
{ validator: rulesSno, trigger: 'blur' },
|
||||
],
|
||||
name: [
|
||||
{ required: true, message: "姓名不能为空", trigger: 'blur' },
|
||||
{ pattern: /^[\u4e00-\u9fa5]{2,5}$/, message: "姓名必须是2-5个汉字", trigger: 'blur' },
|
||||
],
|
||||
gender: [
|
||||
{ required: true, message: "性别不能为空", trigger: 'change' },
|
||||
],
|
||||
birthday: [
|
||||
{ required: true, message: "出生日期不能为空", trigger: 'change' },
|
||||
],
|
||||
mobile: [
|
||||
{ required: true, message: "电话号码不能为空", trigger: 'blur' },
|
||||
{ pattern: /^((0\d{2,3}-\d{7,8})|(1[3456789]\d{9}))$/, message: "请检查电话号码是否输入正确", triggler: 'blur' },
|
||||
],
|
||||
email: [
|
||||
{ required: true, message: "邮箱地址不能为空", trigger: 'blur' },
|
||||
{
|
||||
pattern: /^([a-zA-Z0-9]+[-_\.]?)+@[a-zA-Z0-9]+\.[a-z]+$/,
|
||||
message: "请检查邮箱地址是否输入正确", trigger: 'blur'
|
||||
},
|
||||
],
|
||||
address: [
|
||||
{ required: true, message: "家庭住址不能为空", trigger: 'blur' },
|
||||
]
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
mounted() {
|
||||
// 自动加载数据
|
||||
this.getStudents();
|
||||
},
|
||||
// 事件
|
||||
methods: {
|
||||
// 获取所有学生的信息
|
||||
getStudents: function () {
|
||||
// 记录 this 的地址
|
||||
let that = this
|
||||
// 使用 Axios 实现 Ajax 请求
|
||||
axios
|
||||
.get(that.baseURL + "students/")
|
||||
.then(function (res) {
|
||||
// 请求成功后执行的函数
|
||||
if (res.data.code == 1) {
|
||||
// 数据返回给 students
|
||||
that.students = res.data.data;
|
||||
// 获取返回记录的总行数
|
||||
that.total = res.data.data.length;
|
||||
// 获取当前页的数据
|
||||
that.getPageStudents();
|
||||
// 弹窗提示
|
||||
that.$message({
|
||||
message: '数据加载成功!',
|
||||
type: 'success'
|
||||
});
|
||||
console.log(that.students);
|
||||
} else {
|
||||
that.$message.error(res.data.msg);
|
||||
}
|
||||
})
|
||||
.catch(function (err) {
|
||||
// 请求失败后执行的函数
|
||||
console.log(err)
|
||||
});
|
||||
},
|
||||
// 清除输入内容获取所有学生信息
|
||||
getAllStudents() {
|
||||
this.inputStr = "";
|
||||
this.getStudents();
|
||||
},
|
||||
// 获取当前页的学生数据
|
||||
getPageStudents() {
|
||||
// 清空 pageStudents 中的数据
|
||||
this.pageStudents = [];
|
||||
// 获取当前页的数据
|
||||
for (let i = (this.currentpage - 1) * this.pagesize; i < this.total; i++) {
|
||||
// 遍历数据添加到 pageStudents 中
|
||||
this.pageStudents.push(this.students[i]);
|
||||
// 判断是否达到一页的要求
|
||||
if (this.pageStudents.length === this.pagesize) break;
|
||||
}
|
||||
},
|
||||
// 实现学生信息查询
|
||||
queryStudents() {
|
||||
// 使用Ajax请求 -- POST --> 传递 InputStr
|
||||
let that = this
|
||||
axios
|
||||
.post(
|
||||
that.baseURL + "students/query/",
|
||||
{
|
||||
inputstr: that.inputStr
|
||||
}
|
||||
)
|
||||
.then(function (res) {
|
||||
if (res.data.code === 1) {
|
||||
// 数据返回给 students
|
||||
that.students = res.data.data;
|
||||
// 获取返回记录的总行数
|
||||
that.total = res.data.data.length;
|
||||
// 获取当前页的数据
|
||||
that.getPageStudents();
|
||||
// 弹窗提示
|
||||
that.$message({
|
||||
message: '数据加载成功!',
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
that.$message.error(res.data.msg);
|
||||
}
|
||||
})
|
||||
.catch(function (err) {
|
||||
console.log(err)
|
||||
that.$message.error("获取后端查询结果出现异常!");
|
||||
});
|
||||
},
|
||||
// 添加学生信息明细弹出框
|
||||
addStudent() {
|
||||
// 修改弹出框标题
|
||||
this.dialogTitle = "添加学生明细";
|
||||
// 弹出表单
|
||||
this.dialogVisible = true;
|
||||
},
|
||||
// 根据 id 获取 image
|
||||
getImageBySno(sno) {
|
||||
for(oneStudent of this.students) {
|
||||
// 判断
|
||||
if(oneStudent.sno == sno) {
|
||||
return oneStudent.image;
|
||||
}
|
||||
}
|
||||
},
|
||||
// 查看学生信息明细弹出框
|
||||
viewStudent(row) {
|
||||
// 修改弹出框标题
|
||||
this.dialogTitle = "查看学生明细";
|
||||
// 修改 isView 变量
|
||||
this.isView = true;
|
||||
// 弹出表单
|
||||
this.dialogVisible = true;
|
||||
// 深拷贝方法:
|
||||
this.studentForm = JSON.parse(JSON.stringify(row));
|
||||
// 获取照片
|
||||
this.studentForm.image = this.getImageBySno(row.sno);
|
||||
// 获取照片url
|
||||
this.studentForm.imageUrl = this.baseURL + 'media/' + this.studentForm.image;
|
||||
},
|
||||
// 编辑学生详细信息弹出框
|
||||
updateStudent(row) {
|
||||
// 修改弹出框标题
|
||||
this.dialogTitle = "编辑学生明细";
|
||||
// 修改 isEdit 变量
|
||||
this.isEdit = true;
|
||||
// 弹出表单
|
||||
this.dialogVisible = true;
|
||||
// 深拷贝方法:
|
||||
this.studentForm = JSON.parse(JSON.stringify(row));
|
||||
// 获取照片
|
||||
this.studentForm.image = this.getImageBySno(row.sno);
|
||||
// 获取照片url
|
||||
this.studentForm.imageUrl = this.baseURL + 'media/' + this.studentForm.image;
|
||||
},
|
||||
// 提交学生的表单(添加、编辑)
|
||||
submitStudentForm(formName) {
|
||||
this.$refs[formName].validate((valid) => {
|
||||
if (valid) {
|
||||
// 判断提交表单事件类型,添加 or 编辑
|
||||
if (this.isEdit) {
|
||||
// 修改事件
|
||||
this.submitUpdateStudent();
|
||||
} else {
|
||||
// 添加事件
|
||||
this.submitAddStudent();
|
||||
}
|
||||
} else {
|
||||
console.log('error submit!!');
|
||||
return false;
|
||||
}
|
||||
});
|
||||
},
|
||||
// 添加学生信息到数据库
|
||||
submitAddStudent() {
|
||||
// 定义 that
|
||||
let that = this;
|
||||
// 执行 Axios 请求
|
||||
axios
|
||||
.post(that.baseURL + 'student/add/', that.studentForm)
|
||||
.then(res => {
|
||||
// 执行成功
|
||||
if (res.data.code === 1) {
|
||||
// 获取所有学生信息
|
||||
that.students = res.data.data;
|
||||
// 获取记录条数
|
||||
that.total = res.data.data.length;
|
||||
// 获取分页信息
|
||||
that.getPageStudents();
|
||||
// 弹窗提示
|
||||
that.$message({
|
||||
message: '数据添加成功!',
|
||||
type: 'success'
|
||||
});
|
||||
// 关闭弹窗
|
||||
that.closeDialogForm('studentForm');
|
||||
} else {
|
||||
that.$message.error(res.data.msg);
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
// 执行失败
|
||||
console.log(err)
|
||||
that.$message.error("添加时获取后端查询结果出现异常!");
|
||||
})
|
||||
},
|
||||
// 编辑学生信息到数据库
|
||||
submitUpdateStudent() {
|
||||
// 定义 that
|
||||
let that = this;
|
||||
// 执行 Axios 请求
|
||||
axios
|
||||
.post(that.baseURL + 'student/update/', that.studentForm)
|
||||
.then(res => {
|
||||
// 执行成功
|
||||
if (res.data.code === 1) {
|
||||
// 获取所有学生信息
|
||||
that.students = res.data.data;
|
||||
// 获取记录条数
|
||||
that.total = res.data.data.length;
|
||||
// 获取分页信息
|
||||
that.getPageStudents();
|
||||
// 弹窗提示
|
||||
that.$message({
|
||||
message: '数据修改成功!',
|
||||
type: 'success'
|
||||
});
|
||||
// 关闭弹窗
|
||||
that.closeDialogForm('studentForm');
|
||||
} else {
|
||||
that.$message.error(res.data.msg);
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
// 执行失败
|
||||
console.log(err)
|
||||
that.$message.error("修改时获取后端查询结果出现异常!");
|
||||
})
|
||||
},
|
||||
// 删除学生信息到数据库
|
||||
deleteStudent(row) {
|
||||
// 等待确认
|
||||
this.$confirm('是否确认删除学生信息【学号:' + row.sno + '\t姓名:' + row.name + '】?', '提示', {
|
||||
confirmButtonText: '确定删除',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
// 确认删除相应事件
|
||||
let that = this
|
||||
// 调用后端接口
|
||||
axios
|
||||
.post(that.baseURL + 'student/delete/', { sno: row.sno })
|
||||
.then(res => {
|
||||
if (res.data.code === 1) {
|
||||
// 获取所有学生信息
|
||||
that.students = res.data.data;
|
||||
// 获取记录数
|
||||
that.total = res.data.data.length;
|
||||
// 获取分页信息
|
||||
that.getPageStudents();
|
||||
// 弹窗提示
|
||||
that.$message({
|
||||
message: '数据删除成功!',
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
that.$message.error(res.data.msg);
|
||||
}
|
||||
})
|
||||
}).catch(() => {
|
||||
this.$message({
|
||||
type: 'info',
|
||||
message: '已取消删除'
|
||||
});
|
||||
});
|
||||
},
|
||||
// 批量删除学生信息到数据库
|
||||
deleteStudents() {
|
||||
// 等待确认
|
||||
this.$confirm("是否确认批量删除 " + this.selectStudents.length + " 名学生信息?", '提示', {
|
||||
confirmButtonText: '确定删除',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
// 确认删除相应事件
|
||||
let that = this
|
||||
// 调用后端接口
|
||||
axios
|
||||
.post(that.baseURL + 'students/delete/', { student: that.selectStudents })
|
||||
.then(res => {
|
||||
if (res.data.code === 1) {
|
||||
// 获取所有学生信息
|
||||
that.students = res.data.data;
|
||||
// 获取记录数
|
||||
that.total = res.data.data.length;
|
||||
// 获取分页信息
|
||||
that.getPageStudents();
|
||||
// 弹窗提示
|
||||
that.$message({
|
||||
message: '数据批量删除成功!',
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
that.$message.error(res.data.msg);
|
||||
}
|
||||
})
|
||||
}).catch(() => {
|
||||
this.$message({
|
||||
type: 'info',
|
||||
message: '已取消删除'
|
||||
});
|
||||
});
|
||||
},
|
||||
// 关闭弹出框的表单
|
||||
closeDialogForm(formName) {
|
||||
// 重置表单校验
|
||||
this.$refs[formName].resetFields();
|
||||
// 清空弹出框集合
|
||||
this.studentForm.sno = '';
|
||||
this.studentForm.name = '';
|
||||
this.studentForm.gender = '';
|
||||
this.studentForm.birthday = '';
|
||||
this.studentForm.mobile = '';
|
||||
this.studentForm.email = '';
|
||||
this.studentForm.address = '';
|
||||
this.studentForm.image = '';
|
||||
this.studentForm.imageUrl = '';
|
||||
// 关闭弹出框
|
||||
this.dialogVisible = false;
|
||||
// 清空 isView 和 isEdit 的值
|
||||
this.isView = false;
|
||||
this.isEdit = false;
|
||||
},
|
||||
//选择学生头像后点击确定后触发的事件
|
||||
uploadPicturePost(file) {
|
||||
//定义that
|
||||
let that = this;
|
||||
//定义一个FormData类
|
||||
let fileReq = new FormData();
|
||||
//把照片穿进去
|
||||
fileReq.append('avatar', file.file);
|
||||
//使用Axios发起Ajax请求
|
||||
axios(
|
||||
{
|
||||
method: 'post',
|
||||
url: that.baseURL + 'upload/',
|
||||
data: fileReq
|
||||
}
|
||||
).then(res => {
|
||||
// 根据code判断是否成功
|
||||
if (res.data.code === 1) {
|
||||
//把照片给image
|
||||
that.studentForm.image = res.data.name;
|
||||
//拼接imageurl
|
||||
that.studentForm.imageUrl = that.baseURL + "media/" + res.data.name;
|
||||
} else {
|
||||
//失败的提示!
|
||||
that.$message.error(res.data.msg);
|
||||
}
|
||||
|
||||
}).catch(err => {
|
||||
console.log(err);
|
||||
that.$message.error("上传头像出现异常!");
|
||||
})
|
||||
|
||||
},
|
||||
// excel文件导入
|
||||
uploadExcelPost(file) {
|
||||
let that = this
|
||||
//实例化一个formdata
|
||||
//定义一个FormData类
|
||||
let fileReq = new FormData();
|
||||
//把照片穿进去
|
||||
fileReq.append('excel', file.file);
|
||||
//使用Axios发起Ajax请求
|
||||
axios(
|
||||
{
|
||||
method: 'post',
|
||||
url: that.baseURL + 'excel/import/',
|
||||
data: fileReq
|
||||
}
|
||||
).then(res => {
|
||||
// 根据code判断是否成功
|
||||
if (res.data.code === 1) {
|
||||
//把照片给image
|
||||
that.students = res.data.data;
|
||||
//计算总共多少条
|
||||
that.total = res.data.data.length;
|
||||
//分页
|
||||
that.getPageStudents();
|
||||
//弹出框体显示结果
|
||||
this.$alert('本次导入完成! 成功:' + res.data.success +'失败:'+ res.data.error
|
||||
, '导入结果展示', {
|
||||
confirmButtonText: '确定',
|
||||
callback: action => {
|
||||
this.$message({
|
||||
type: 'info',
|
||||
message: "本次导入失败数量为:" + res.data.error + ",具体的学号:"+res.data.errors,
|
||||
});
|
||||
}
|
||||
});
|
||||
//把失败明细打印
|
||||
console.log("本次导入失败数量为:" + res.data.error + ",具体的学号:");
|
||||
console.log(res.data.errors);
|
||||
} else {
|
||||
//失败的提示!
|
||||
that.$message.error(res.data.msg);
|
||||
}
|
||||
|
||||
}).catch(err => {
|
||||
console.log(err);
|
||||
that.$message.error("上传Excel出现异常!");
|
||||
})
|
||||
|
||||
},
|
||||
// excel文件导出
|
||||
exportToExcel(){
|
||||
let that = this
|
||||
axios.get(that.baseURL + 'excel/export/')
|
||||
.then(res=>{
|
||||
if(res.data.code ===1){
|
||||
//拼接excel 的完整URL
|
||||
let url = that.baseURL + 'media/'+ res.data.name;
|
||||
//下载
|
||||
window.open(url);
|
||||
} else {
|
||||
that.$message.error("导出Excel出现异常!");
|
||||
}
|
||||
})
|
||||
.catch(err=>{
|
||||
console.log(err);
|
||||
});
|
||||
|
||||
},
|
||||
// 分页时修改每页的行数
|
||||
handleSizeChange(size) {
|
||||
// 修改当前每页的数据行数
|
||||
this.pagesize = size;
|
||||
// 数据重新分页
|
||||
this.getPageStudents();
|
||||
},
|
||||
// 调整当前的页码
|
||||
handleCurrentChange(pageNumber) {
|
||||
// 修改当前的页码
|
||||
this.currentpage = pageNumber;
|
||||
// 数据重新分页
|
||||
this.getPageStudents();
|
||||
},
|
||||
// 选择复选框时触发的操作
|
||||
handleSelectionChange(data) {
|
||||
this.selectStudents = data;
|
||||
console.log(data);
|
||||
},
|
||||
},
|
||||
})
|
||||
15
manage.py
Executable file
15
manage.py
Executable file
@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env python
|
||||
import os
|
||||
import sys
|
||||
|
||||
if __name__ == '__main__':
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'simsV4BE.settings')
|
||||
try:
|
||||
from django.core.management import execute_from_command_line
|
||||
except ImportError as exc:
|
||||
raise ImportError(
|
||||
"Couldn't import Django. Are you sure it's installed and "
|
||||
"available on your PYTHONPATH environment variable? Did you "
|
||||
"forget to activate a virtual environment?"
|
||||
) from exc
|
||||
execute_from_command_line(sys.argv)
|
||||
BIN
media/020244015af815990e78b38edc1f591f.xlsx
Normal file
BIN
media/020244015af815990e78b38edc1f591f.xlsx
Normal file
Binary file not shown.
BIN
media/1bf7d88cf023a161719b091a4a936ff9.jpg
Normal file
BIN
media/1bf7d88cf023a161719b091a4a936ff9.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 391 KiB |
BIN
media/1e21250c7bd909f6b352a271336622d8.xlsx
Normal file
BIN
media/1e21250c7bd909f6b352a271336622d8.xlsx
Normal file
Binary file not shown.
BIN
media/5258c89e75ee07eb3c696bb5c1c44c35.xlsx
Normal file
BIN
media/5258c89e75ee07eb3c696bb5c1c44c35.xlsx
Normal file
Binary file not shown.
BIN
media/5ae7457447689f8e3a355ca01f6cefd6.xlsx
Normal file
BIN
media/5ae7457447689f8e3a355ca01f6cefd6.xlsx
Normal file
Binary file not shown.
BIN
media/643c35b50783da9b0f3175e86250f1fd.xlsx
Normal file
BIN
media/643c35b50783da9b0f3175e86250f1fd.xlsx
Normal file
Binary file not shown.
BIN
media/66512e369676e82d4773bc22794d1b17.xlsx
Normal file
BIN
media/66512e369676e82d4773bc22794d1b17.xlsx
Normal file
Binary file not shown.
BIN
media/6cd378e58eb3c0618daf29b18e8aa924.xlsx
Normal file
BIN
media/6cd378e58eb3c0618daf29b18e8aa924.xlsx
Normal file
Binary file not shown.
BIN
media/7199f91eb8152fb7872fde2c4471c456.xlsx
Normal file
BIN
media/7199f91eb8152fb7872fde2c4471c456.xlsx
Normal file
Binary file not shown.
BIN
media/89847b3b30e9598c35b5e3c800eaf1c2.png
Normal file
BIN
media/89847b3b30e9598c35b5e3c800eaf1c2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 132 KiB |
BIN
media/985e8e70575166b735bcb5ac89f3e6a4.jpg
Normal file
BIN
media/985e8e70575166b735bcb5ac89f3e6a4.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 391 KiB |
BIN
media/988955a002698943f79b927c849a2a56.xlsx
Normal file
BIN
media/988955a002698943f79b927c849a2a56.xlsx
Normal file
Binary file not shown.
BIN
media/a91018d7221cad6b0ca632c935afea52.jpg
Normal file
BIN
media/a91018d7221cad6b0ca632c935afea52.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 391 KiB |
BIN
media/ad9ffec351ea5cb1b631871cae00a643.xlsx
Normal file
BIN
media/ad9ffec351ea5cb1b631871cae00a643.xlsx
Normal file
Binary file not shown.
BIN
media/da5657f0272e98cf70e1425dbb933f4f.xlsx
Normal file
BIN
media/da5657f0272e98cf70e1425dbb933f4f.xlsx
Normal file
Binary file not shown.
BIN
media/dd145fe8f40012320b7fbdc61347ae51.xlsx
Normal file
BIN
media/dd145fe8f40012320b7fbdc61347ae51.xlsx
Normal file
Binary file not shown.
BIN
media/df0da2e9716d44c71114c5f66bfd7911.xlsx
Normal file
BIN
media/df0da2e9716d44c71114c5f66bfd7911.xlsx
Normal file
Binary file not shown.
BIN
media/ed570ccb0a3b8395fdc4f8752a063db4.jpg
Normal file
BIN
media/ed570ccb0a3b8395fdc4f8752a063db4.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 391 KiB |
BIN
media/f647b738bea5e567e8b4567a9d501740.xlsx
Normal file
BIN
media/f647b738bea5e567e8b4567a9d501740.xlsx
Normal file
Binary file not shown.
BIN
media/fd13d07a999dc2447cc5c62c720bd82e.xlsx
Normal file
BIN
media/fd13d07a999dc2447cc5c62c720bd82e.xlsx
Normal file
Binary file not shown.
4
module/requirements.txt
Executable file
4
module/requirements.txt
Executable file
@ -0,0 +1,4 @@
|
||||
django==2.1.4
|
||||
pymysql==0.9.3
|
||||
django-cors-headers==3.2.0
|
||||
openpyxl==2.6.2
|
||||
10
module/run.sh
Executable file
10
module/run.sh
Executable file
@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 使用阿里云源安装必须组件
|
||||
#pip config set global.index-url https://mirrors.aliyun.com/pypi/simple && \
|
||||
#pip config set global.trusted-host mirrors.aliyun.com && \
|
||||
#pip install -r /module/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
|
||||
pip install -r /module/requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
|
||||
|
||||
# 启动程序
|
||||
python /simsBE/manage.py runserver 0.0.0.0:8000
|
||||
9
module/run.sh_bak
Normal file
9
module/run.sh_bak
Normal file
@ -0,0 +1,9 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 使用阿里云源安装必须组件
|
||||
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple && \
|
||||
pip config set global.trusted-host mirrors.aliyun.com && \
|
||||
pip install -r /module/requirements.txt
|
||||
|
||||
# 启动程序
|
||||
python /simsBE/manage.py runserver 0.0.0.0:8000
|
||||
79
nginx/conf.d/default.conf
Executable file
79
nginx/conf.d/default.conf
Executable file
@ -0,0 +1,79 @@
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
server_name localhost;
|
||||
|
||||
location / {
|
||||
root /simsFE;
|
||||
index index.html index.htm;
|
||||
}
|
||||
location /student/ {
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header X-Nginx-Proxy true;
|
||||
proxy_set_header Host $host:$server_port;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_pass http://simsbe:8000/student/;
|
||||
}
|
||||
location /students/ {
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header X-Nginx-Proxy true;
|
||||
proxy_set_header Host $host:$server_port;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_pass http://simsbe:8000/students/;
|
||||
}
|
||||
location /sno/ {
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header X-Nginx-Proxy true;
|
||||
proxy_set_header Host $host:$server_port;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_pass http://simsbe:8000/sno/;
|
||||
}
|
||||
location /upload/ {
|
||||
client_max_body_size 20m; # 设置上传文件的最大大小为 20MB
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header X-Nginx-Proxy true;
|
||||
proxy_set_header Host $host:$server_port;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_pass http://simsbe:8000/upload/;
|
||||
}
|
||||
location /media/ {
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header X-Nginx-Proxy true;
|
||||
proxy_set_header Host $host:$server_port;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_pass http://simsbe:8000/media/;
|
||||
}
|
||||
location /excel/ {
|
||||
client_max_body_size 20m; # 设置上传文件的最大大小为 20MB
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header X-Nginx-Proxy true;
|
||||
proxy_set_header Host $host:$server_port;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_pass http://simsbe:8000/excel/;
|
||||
}
|
||||
}
|
||||
|
||||
50
nginx/nginx.conf
Executable file
50
nginx/nginx.conf
Executable file
@ -0,0 +1,50 @@
|
||||
user nginx;
|
||||
worker_processes 2;
|
||||
|
||||
error_log /var/log/nginx/error.log notice;
|
||||
pid /var/run/nginx.pid;
|
||||
|
||||
|
||||
events {
|
||||
worker_connections 10240;
|
||||
}
|
||||
|
||||
|
||||
http {
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
|
||||
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||
'$status $body_bytes_sent "$http_referer" '
|
||||
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||
|
||||
access_log /var/log/nginx/access.log main;
|
||||
|
||||
# 文件快速传输
|
||||
sendfile on;
|
||||
#tcp_nopush on;
|
||||
server_tokens off;
|
||||
keepalive_timeout 65;
|
||||
|
||||
gzip on;
|
||||
#不压缩临界值,大于4K的才压缩
|
||||
gzip_min_length 4k;
|
||||
gzip_buffers 4 16k;
|
||||
#用了反向代理的话,末端通信是HTTP/1.0,默认是HTTP/1.1
|
||||
#gzip_http_version 1.0;
|
||||
#压缩级别,1-10,数字越大压缩的越好,时间也越长
|
||||
gzip_comp_level 6;
|
||||
#进行压缩的文件类型,
|
||||
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
|
||||
gzip_vary off;
|
||||
gzip_disable "MSIE [1-6]\.";
|
||||
|
||||
# 过滤代理自身IP
|
||||
real_ip_header proxy_protocol;
|
||||
set_real_ip_from 172.16.0.0/12;
|
||||
set_real_ip_from 10.100.0.1;
|
||||
real_ip_recursive on;
|
||||
|
||||
|
||||
include /etc/nginx/conf.d/*.conf;
|
||||
}
|
||||
0
simsV4BE/__init__.py
Executable file
0
simsV4BE/__init__.py
Executable file
BIN
simsV4BE/__pycache__/__init__.cpython-37.pyc
Executable file
BIN
simsV4BE/__pycache__/__init__.cpython-37.pyc
Executable file
Binary file not shown.
BIN
simsV4BE/__pycache__/settings.cpython-37.pyc
Executable file
BIN
simsV4BE/__pycache__/settings.cpython-37.pyc
Executable file
Binary file not shown.
BIN
simsV4BE/__pycache__/urls.cpython-37.pyc
Executable file
BIN
simsV4BE/__pycache__/urls.cpython-37.pyc
Executable file
Binary file not shown.
BIN
simsV4BE/__pycache__/wsgi.cpython-37.pyc
Executable file
BIN
simsV4BE/__pycache__/wsgi.cpython-37.pyc
Executable file
Binary file not shown.
146
simsV4BE/settings.py
Executable file
146
simsV4BE/settings.py
Executable file
@ -0,0 +1,146 @@
|
||||
"""
|
||||
Django settings for simsV4BE project.
|
||||
|
||||
Generated by 'django-admin startproject' using Django 2.1.4.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/2.1/topics/settings/
|
||||
|
||||
For the full list of settings and their values, see
|
||||
https://docs.djangoproject.com/en/2.1/ref/settings/
|
||||
"""
|
||||
|
||||
import os, sys
|
||||
|
||||
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
||||
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
|
||||
|
||||
|
||||
# Quick-start development settings - unsuitable for production
|
||||
# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/
|
||||
|
||||
# SECURITY WARNING: keep the secret key used in production secret!
|
||||
SECRET_KEY = '+*#94$=jxxnz6vqju=^mj9fmd7gwcz81q(u*1(z5j_#7ahmy6s'
|
||||
|
||||
# SECURITY WARNING: don't run with debug turned on in production!
|
||||
DEBUG = True
|
||||
|
||||
ALLOWED_HOSTS = [
|
||||
'*', # 允许所有地址
|
||||
]
|
||||
|
||||
# Application definition
|
||||
|
||||
INSTALLED_APPS = [
|
||||
'django.contrib.admin',
|
||||
'django.contrib.auth',
|
||||
'django.contrib.contenttypes',
|
||||
'django.contrib.sessions',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
'sims',
|
||||
'corsheaders',
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
'django.middleware.security.SecurityMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
'corsheaders.middleware.CorsMiddleware',
|
||||
#'django.middleware.csrf.CsrfViewMiddleware',
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
]
|
||||
|
||||
ROOT_URLCONF = 'simsV4BE.urls'
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
'DIRS': [BASE_DIR, '/templates']
|
||||
,
|
||||
'APP_DIRS': True,
|
||||
'OPTIONS': {
|
||||
'context_processors': [
|
||||
'django.template.context_processors.debug',
|
||||
'django.template.context_processors.request',
|
||||
'django.contrib.auth.context_processors.auth',
|
||||
'django.contrib.messages.context_processors.messages',
|
||||
],
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
WSGI_APPLICATION = 'simsV4BE.wsgi.application'
|
||||
|
||||
|
||||
# Database
|
||||
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
|
||||
|
||||
#DATABASES = {
|
||||
# 'default': {
|
||||
# 'ENGINE': 'django.db.backends.sqlite3',
|
||||
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
|
||||
# }
|
||||
#}
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.mysql',
|
||||
'NAME': 'sims',
|
||||
'USER': 'root',
|
||||
'PASSWORD': 'admin@123456',
|
||||
'HOST': 'simsdb',
|
||||
'PORT': '3306',
|
||||
}
|
||||
}
|
||||
|
||||
# Password validation
|
||||
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators
|
||||
|
||||
AUTH_PASSWORD_VALIDATORS = [
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
|
||||
},
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
|
||||
},
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
|
||||
},
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
# Internationalization
|
||||
# https://docs.djangoproject.com/en/2.1/topics/i18n/
|
||||
|
||||
LANGUAGE_CODE = 'en-us'
|
||||
|
||||
TIME_ZONE = 'UTC'
|
||||
|
||||
USE_I18N = True
|
||||
|
||||
USE_L10N = True
|
||||
|
||||
USE_TZ = True
|
||||
|
||||
|
||||
# Static files (CSS, JavaScript, Images)
|
||||
# https://docs.djangoproject.com/en/2.1/howto/static-files/
|
||||
|
||||
STATIC_URL = '/static/'
|
||||
|
||||
# 设置上传文件目录和外部访问路径
|
||||
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
|
||||
MEDIA_URL = '/media/'
|
||||
|
||||
CORS_ALLOWED_ORIGINS = {
|
||||
"https://example.com",
|
||||
"https://sub.example.com",
|
||||
"http://localhost:8080",
|
||||
"http://127.0.0.1:9000",
|
||||
}
|
||||
38
simsV4BE/urls.py
Executable file
38
simsV4BE/urls.py
Executable file
@ -0,0 +1,38 @@
|
||||
"""simsV4BE URL Configuration
|
||||
|
||||
The `urlpatterns` list routes URLs to views. For more information please see:
|
||||
https://docs.djangoproject.com/en/2.1/topics/http/urls/
|
||||
Examples:
|
||||
Function views
|
||||
1. Add an import: from my_app import views
|
||||
2. Add a URL to urlpatterns: path('', views.home, name='home')
|
||||
Class-based views
|
||||
1. Add an import: from other_app.views import Home
|
||||
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
|
||||
Including another URLconf
|
||||
1. Import the include() function: from django.urls import include, path
|
||||
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||
"""
|
||||
from django.contrib import admin
|
||||
from django.urls import path
|
||||
from sims import views
|
||||
from django.conf import settings
|
||||
from django.conf.urls.static import static
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
path('admin/', admin.site.urls),
|
||||
path('students/', views.get_students), # 获取所有学生信息的接口
|
||||
path('students/query/', views.query_students), # 查询学生信息的接口
|
||||
path('sno/check/', views.is_exists_sno), # 校验学号是否已存在
|
||||
path('student/add/', views.add_student), # 添加学生信息的接口
|
||||
path('student/update/', views.update_student), # 修改学生信息的接口
|
||||
path('student/delete/', views.delete_student), # 删除学生信息的接口
|
||||
path('students/delete/', views.delete_students), # 批量删除学生信息的接口
|
||||
path('upload/', views.upload), # 上传文件接口
|
||||
path('excel/import/', views.import_students_excel), # 导入excel文件
|
||||
path('excel/export/', views.export_students_excel) # 导出excel文件
|
||||
]
|
||||
|
||||
# 允许所有的media文件被访问
|
||||
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||
16
simsV4BE/wsgi.py
Executable file
16
simsV4BE/wsgi.py
Executable file
@ -0,0 +1,16 @@
|
||||
"""
|
||||
WSGI config for simsV4BE project.
|
||||
|
||||
It exposes the WSGI callable as a module-level variable named ``application``.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
from django.core.wsgi import get_wsgi_application
|
||||
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'simsV4BE.settings')
|
||||
|
||||
application = get_wsgi_application()
|
||||
Loading…
Reference in New Issue
Block a user