【项目功能介绍】
本系统包含后台管理和前端app双端系统,后台管理的功能包含: 登录, 退出, 修改管理员信息(基本信息与头像),资源管理, 角色管理,资源权限分配, 数据字典管理,学生管理,班级管理,教师管理,课程管理; app端功能包含学生与老师二种角色, 学生功能:登录,退出, 学生所有学习的课程列表,课程相应信息及课程教师信息展示,学生给教师评分功能,学生成绩排名功能, 用户基本信息管理, 用户头像修改, 密码修改 老师功能:登录,退出, 老师所有授课的课程列表,课程相应信息及课程教师信息展示,老师评价信息,学生成绩设置, 用户基本信息管理, 用户头像修改, 密码修改
代码下载:
链接:https://pan.baidu.com/s/12BCbLbIF8VioVYACwNicHQ
提取码:8888
【项目视频教程】
视频教程每个课时包含的内容见下图, 该套教程具有非常高的知识价值 并且 适合以下人群:
A. 想了解并且学习代码实现逻辑的同学
B. 想对代码进行二次开发的同学
C. 在课题设计和毕业设计中,需要对老师问答做到得心应手的同学
D.做论文时,需要技术和业务层面帮助进行文字描述以及绘制流程图(时序图, ER图, 原理图)的同学

【项目包含内容】

【运行环境】 IDEA, JDK1.8, MAVEN, AndroidStudio
【技术栈】
Web端
后台前端:layui,js、jQuery、css、html
后台框架:Java、Spring boot、Spring Mvc、Mybatis Plus、Shiro、ajax
数据库:Mysql5.7
App客户端
前端框架:xml、LinearLayout、RelativeLayout
后台框架:OkHttp、fastJson
【部分代码】
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="cn.xiaoph.apps">
<!-- Required -->
<permission
android:name="cn.xiaoph.apps.permission.JPUSH_MESSAGE"
android:protectionLevel="signature" />
<!-- Required 一些系统要求的权限,如访问网络等-->
<uses-permission android:name="cn.xiaoph.apps.permission.JPUSH_MESSAGE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission
android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- Optional for location -->
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 用于开启 debug 版本的应用在6.0 系统上 层叠窗口权限 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<application
android:name=".Application"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:replace="android:icon,android:theme,android:allowBackup,android:label,android:supportsRtl">
<meta-data
android:name="domain_name"
android:value="192.168.0.103:8080" />
<meta-data
android:name="timeout"
android:value="5000" />
<activity android:name=".activity.LoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".activity.UserInfoActivity" />
<activity android:name=".activity.UpdatePwdActivity" />
<activity android:name=".activity.UpdateNiceActivity" />
<activity android:name=".activity.UpdateEmailActivity" />
<activity android:name=".activity.ViewUserActivity" />
<activity android:name=".activity.HomeActivity" />
<activity android:name=".activity.RegisterActivity" />
<activity android:name=".activity.UpdatePhoneActivity" />
<!-- Rich push 核心功能 since 2.0.6-->
<activity
android:name="cn.jpush.android.ui.PopWinActivity"
android:exported="false"
android:theme="@style/MyDialogStyle"></activity>
<!-- Required SDK核心功能-->
<activity
android:name="cn.jpush.android.ui.PushActivity"
android:configChanges="orientation|keyboardHidden"
android:exported="false"
android:theme="@android:style/Theme.NoTitleBar">
<intent-filter>
<action android:name="cn.jpush.android.ui.PushActivity" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="cn.xiaoph.apps" />
</intent-filter>
</activity>
<activity android:name=".activity.ChatActivity" />
<activity android:name=".activity.ViewTeacherCourseActivity" />
<activity android:name=".activity.ViewStudentCourseActivity" />
<!-- Required SDK 核心功能-->
<!-- 可配置android:process参数将PushService放在其他进程中 -->
<service
android:name="cn.jpush.android.service.PushService"
android:exported="false"
android:process=":pushcore">
<intent-filter>
<action android:name="cn.jpush.android.intent.REGISTER" />
<action android:name="cn.jpush.android.intent.REPORT" />
<action android:name="cn.jpush.android.intent.PushService" />
<action android:name="cn.jpush.android.intent.PUSH_TIME" />
</intent-filter>
</service>
<!-- since 3.0.9 Required SDK 核心功能-->
<provider
android:name="cn.jpush.android.service.DataProvider"
android:authorities="cn.xiaoph.apps.DataProvider"
android:exported="false"
android:process=":pushcore" />
<!-- since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互拉起的功能。 -->
<!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 -->
<service
android:name="cn.jpush.android.service.DaemonService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="cn.jpush.android.intent.DaemonService" />
<category android:name="cn.xiaoph.apps" />
</intent-filter>
</service>
<!-- since 3.1.0 Required SDK 核心功能-->
<provider
android:name="cn.jpush.android.service.DownloadProvider"
android:authorities="cn.xiaoph.apps.DownloadProvider"
android:exported="true" />
<!-- Required SDK核心功能-->
<receiver
android:name="cn.jpush.android.service.PushReceiver"
android:enabled="true"
android:exported="false">
<intent-filter android:priority="1000">
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" /> <!--Required 显示通知栏 -->
<category android:name="cn.xiaoph.apps" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
<!-- Optional -->
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
<!-- Required SDK核心功能-->
<receiver
android:name="cn.jpush.android.service.AlarmReceiver"
android:exported="false" />
<!-- User defined. For test only 用户自定义的广播接收器-->
<receiver
android:name="cn.xiaoph.apps.jpush.MyReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="cn.jpush.android.intent.REGISTRATION" /> <!--Required 用户注册SDK的intent-->
<action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" /> <!--Required 用户接收SDK消息的intent-->
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" /> <!--Required 用户接收SDK通知栏信息的intent-->
<action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" /> <!--Required 用户打开自定义通知栏的intent-->
<action android:name="cn.jpush.android.intent.CONNECTION" /><!-- 接收网络变化 连接/断开 since 1.6.3 -->
<category android:name="cn.xiaoph.apps" />
</intent-filter>
</receiver>
<!-- User defined. For test only 用户自定义接收消息器,3.0.7开始支持,目前新tag/alias接口设置结果会在该广播接收器对应的方法中回调-->
<receiver android:name="cn.xiaoph.apps.jpush.MyJPushMessageReceiver">
<intent-filter>
<action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
<category android:name="cn.xiaoph.apps"></category>
</intent-filter>
</receiver>
<!-- Required . Enable it you can get statistics data with channel -->
<meta-data
android:name="JPUSH_CHANNEL"
android:value="developer-default" />
<meta-data
android:name="JPUSH_APPKEY"
android:value="9ab81e5c632e870caa0bdc97" /> <!-- </>值来自开发者平台取得的AppKey-->
</application>
</manifest>
LoginController:
package com.myway.platform.controller.v1.restful;
import com.myway.platform.api.ReturnResult;
import com.myway.platform.controller.BaseController;
import com.myway.platform.utils.MD5Util;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author bruce
* @since 2020/4/25 0025 14:43
*/
@Slf4j
@RestController
public class LoginController extends BaseController {
@PostMapping("login")
public ReturnResult login(String account, String password, String code) {
ReturnResult result = new ReturnResult();
// Object verificationCode = request().getSession().getAttribute("code");
// if (!StringUtils.isEmpty(verificationCode) && verificationCode.equals(code.toUpperCase())){
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(account, MD5Util.MD5Encode(password, "utf-8"));
subject.login(usernamePasswordToken);
String token = SecurityUtils.getSubject().getSession().getId().toString();
result.set("token", token);
result.set("mapper", "/master");
// }else {
// result.setErrorMsg("验证码错误");
// result.rollback();
// }
return result;
}
@PostMapping("logout")
public ReturnResult logout() {
ReturnResult result = new ReturnResult();
SecurityUtils.getSubject().logout();
result.commit();
return result;
}
}
【项目代码截图】

【数据库截图】

【项目运行截图】


正在上传…重新上传取消
