Initial commit

dev1
呗 呗 3 years ago
commit 941f6b3c52

15
.gitignore vendored

@ -0,0 +1,15 @@
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties

3
.idea/.gitignore vendored

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="11" />
</component>
</project>

@ -0,0 +1,611 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DBNavigator.Project.DataEditorManager">
<record-view-column-sorting-type value="BY_INDEX" />
<value-preview-text-wrapping value="true" />
<value-preview-pinned value="false" />
</component>
<component name="DBNavigator.Project.DataExportManager">
<export-instructions>
<create-header value="true" />
<friendly-headers value="false" />
<quote-values-containing-separator value="true" />
<quote-all-values value="false" />
<value-separator value="" />
<file-name value="" />
<file-location value="" />
<scope value="GLOBAL" />
<destination value="FILE" />
<format value="EXCEL" />
<charset value="GBK" />
<charset value="GBK" />
</export-instructions>
</component>
<component name="DBNavigator.Project.DatabaseBrowserManager">
<autoscroll-to-editor value="false" />
<autoscroll-from-editor value="true" />
<show-object-properties value="true" />
<loaded-nodes />
</component>
<component name="DBNavigator.Project.DatabaseConsoleManager">
<connection id="2b93b0b9-cb60-4d4b-9737-fa63f2265d4f">
<console name="Connection" type="STANDARD" schema="" session="Main"><![CDATA[select
ui._id,
ui."appKey",
ui.avatar,
ui."collegeName",
ui."createTime",
ui.email,
ui.gender,
ui.id,
ui."idNumber",
ui."inSchoolTime",
ui."lastUpdateTime",
ui.phone,
ui."realName",
ui."roleId",
ui."userName"
from
user_info ui;
insert into user_info (
_id,
"appKey",
avatar,
"collegeName",
"createTime",
email,
gender,
id,
"idNumber",
"inSchoolTime",
"lastUpdateTime",
phone,
"realName",
"roleId",
"userName")
values (
:_id,
:appKey,
:avatar,
:collegeName,
:createTime,
:email,
:gender,
:id,
:idNumber,
:inSchoolTime,
:lastUpdateTime,
:phone,
:realName,
:roleId,
:userName)
;]]></console>
</connection>
</component>
<component name="DBNavigator.Project.DatabaseFileManager">
<open-files />
</component>
<component name="DBNavigator.Project.DatabaseSessionManager">
<connection id="2b93b0b9-cb60-4d4b-9737-fa63f2265d4f" />
</component>
<component name="DBNavigator.Project.DatasetFilterManager">
<filter-actions connection-id="2b93b0b9-cb60-4d4b-9737-fa63f2265d4f" dataset="main.user_info" active-filter-id="" />
</component>
<component name="DBNavigator.Project.EditorStateManager">
<last-used-providers />
</component>
<component name="DBNavigator.Project.ExecutionManager">
<retain-sticky-names value="false" />
</component>
<component name="DBNavigator.Project.MethodExecutionManager">
<method-browser />
<execution-history>
<group-entries value="true" />
<execution-inputs />
</execution-history>
<argument-values-cache />
</component>
<component name="DBNavigator.Project.ObjectDependencyManager">
<last-used-dependency-type value="INCOMING" />
</component>
<component name="DBNavigator.Project.ObjectQuickFilterManager">
<last-used-operator value="EQUAL" />
<filters />
</component>
<component name="DBNavigator.Project.ParserDiagnosticsManager">
<diagnostics-history />
</component>
<component name="DBNavigator.Project.ScriptExecutionManager" clear-outputs="true">
<recently-used-interfaces />
</component>
<component name="DBNavigator.Project.Settings">
<connections>
<connection id="2b93b0b9-cb60-4d4b-9737-fa63f2265d4f" active="true" signed="true">
<database>
<name value="Connection" />
<description value="User" />
<database-type value="SQLITE" />
<config-type value="BASIC" />
<database-version value="3.3" />
<driver-source value="BUILTIN" />
<driver-library value="" />
<driver value="" />
<url-type value="FILE" />
<host value="" />
<port value="" />
<database value="" />
<files>
<file path="E:\CourseDesign\androidDevelopment\code\final\S.T.Link\app\src\main\res\raws\userInfo.db" schema="main" />
</files>
<type value="NONE" />
<user value="" />
<deprecated-pwd value="" />
</database>
<properties>
<auto-commit value="false" />
</properties>
<ssh-settings>
<active value="false" />
<proxy-host value="" />
<proxy-port value="22" />
<proxy-user value="" />
<deprecated-proxy-pwd value="" />
<auth-type value="PASSWORD" />
<key-file value="" />
<key-passphrase value="" />
</ssh-settings>
<ssl-settings>
<active value="false" />
<certificate-authority-file value="" />
<client-certificate-file value="" />
<client-key-file value="" />
</ssl-settings>
<details>
<charset value="UTF-8" />
<session-management value="true" />
<ddl-file-binding value="true" />
<database-logging value="true" />
<connect-automatically value="true" />
<restore-workspace value="true" />
<restore-workspace-deep value="false" />
<environment-type value="default" />
<connectivity-timeout value="5" />
<idle-time-to-disconnect value="30" />
<idle-time-to-disconnect-pool value="5" />
<credential-expiry-time value="10" />
<max-connection-pool-size value="7" />
<alternative-statement-delimiter value="" />
</details>
<object-filters hide-empty-schemas="false" hide-pseudo-columns="false">
<object-type-filter>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="true" />
<object-type name="ROLE" enabled="true" />
<object-type name="PRIVILEGE" enabled="true" />
<object-type name="CHARSET" enabled="true" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED_VIEW" enabled="true" />
<object-type name="NESTED_TABLE" enabled="true" />
<object-type name="COLUMN" enabled="true" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET_TRIGGER" enabled="true" />
<object-type name="DATABASE_TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="true" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="TYPE_ATTRIBUTE" enabled="true" />
<object-type name="ARGUMENT" enabled="true" />
<object-type name="DIMENSION" enabled="true" />
<object-type name="CLUSTER" enabled="true" />
<object-type name="DBLINK" enabled="true" />
</object-type-filter>
<object-name-filters />
</object-filters>
</connection>
</connections>
<browser-settings>
<general>
<display-mode value="TABBED" />
<navigation-history-size value="100" />
<show-object-details value="false" />
</general>
<filters>
<object-type-filter>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="true" />
<object-type name="ROLE" enabled="true" />
<object-type name="PRIVILEGE" enabled="true" />
<object-type name="CHARSET" enabled="true" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED_VIEW" enabled="true" />
<object-type name="NESTED_TABLE" enabled="true" />
<object-type name="COLUMN" enabled="true" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET_TRIGGER" enabled="true" />
<object-type name="DATABASE_TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="true" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="TYPE_ATTRIBUTE" enabled="true" />
<object-type name="ARGUMENT" enabled="true" />
<object-type name="DIMENSION" enabled="true" />
<object-type name="CLUSTER" enabled="true" />
<object-type name="DBLINK" enabled="true" />
</object-type-filter>
</filters>
<sorting>
<object-type name="COLUMN" sorting-type="NAME" />
<object-type name="FUNCTION" sorting-type="NAME" />
<object-type name="PROCEDURE" sorting-type="NAME" />
<object-type name="ARGUMENT" sorting-type="POSITION" />
</sorting>
<default-editors>
<object-type name="VIEW" editor-type="SELECTION" />
<object-type name="PACKAGE" editor-type="SELECTION" />
<object-type name="TYPE" editor-type="SELECTION" />
</default-editors>
</browser-settings>
<navigation-settings>
<lookup-filters>
<lookup-objects>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="false" />
<object-type name="ROLE" enabled="false" />
<object-type name="PRIVILEGE" enabled="false" />
<object-type name="CHARSET" enabled="false" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED VIEW" enabled="true" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET TRIGGER" enabled="true" />
<object-type name="DATABASE TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="false" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="DIMENSION" enabled="false" />
<object-type name="CLUSTER" enabled="false" />
<object-type name="DBLINK" enabled="true" />
</lookup-objects>
<force-database-load value="false" />
<prompt-connection-selection value="true" />
<prompt-schema-selection value="true" />
</lookup-filters>
</navigation-settings>
<dataset-grid-settings>
<general>
<enable-zooming value="true" />
<enable-column-tooltip value="true" />
</general>
<sorting>
<nulls-first value="true" />
<max-sorting-columns value="4" />
</sorting>
<tracking-columns>
<columnNames value="" />
<visible value="true" />
<editable value="false" />
</tracking-columns>
</dataset-grid-settings>
<dataset-editor-settings>
<text-editor-popup>
<active value="false" />
<active-if-empty value="false" />
<data-length-threshold value="100" />
<popup-delay value="1000" />
</text-editor-popup>
<values-actions-popup>
<show-popup-button value="true" />
<element-count-threshold value="1000" />
<data-length-threshold value="250" />
</values-actions-popup>
<general>
<fetch-block-size value="100" />
<fetch-timeout value="30" />
<trim-whitespaces value="true" />
<convert-empty-strings-to-null value="true" />
<select-content-on-cell-edit value="true" />
<large-value-preview-active value="true" />
</general>
<filters>
<prompt-filter-dialog value="true" />
<default-filter-type value="BASIC" />
</filters>
<qualified-text-editor text-length-threshold="300">
<content-types>
<content-type name="Text" enabled="true" />
<content-type name="Properties" enabled="true" />
<content-type name="XML" enabled="true" />
<content-type name="DTD" enabled="true" />
<content-type name="HTML" enabled="true" />
<content-type name="XHTML" enabled="true" />
<content-type name="Java" enabled="true" />
<content-type name="SQL" enabled="true" />
<content-type name="PL/SQL" enabled="true" />
<content-type name="JSON" enabled="true" />
<content-type name="JSON5" enabled="true" />
<content-type name="Groovy" enabled="true" />
<content-type name="AIDL" enabled="true" />
<content-type name="YAML" enabled="true" />
<content-type name="Manifest" enabled="true" />
</content-types>
</qualified-text-editor>
<record-navigation>
<navigation-target value="VIEWER" />
</record-navigation>
</dataset-editor-settings>
<code-editor-settings>
<general>
<show-object-navigation-gutter value="false" />
<show-spec-declaration-navigation-gutter value="true" />
<enable-spellchecking value="true" />
<enable-reference-spellchecking value="false" />
</general>
<confirmations>
<save-changes value="false" />
<revert-changes value="true" />
</confirmations>
</code-editor-settings>
<code-completion-settings>
<filters>
<basic-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="false" />
<filter-element type="OBJECT" id="view" selected="false" />
<filter-element type="OBJECT" id="materialized view" selected="false" />
<filter-element type="OBJECT" id="index" selected="false" />
<filter-element type="OBJECT" id="constraint" selected="false" />
<filter-element type="OBJECT" id="trigger" selected="false" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="false" />
<filter-element type="OBJECT" id="procedure" selected="false" />
<filter-element type="OBJECT" id="function" selected="false" />
<filter-element type="OBJECT" id="package" selected="false" />
<filter-element type="OBJECT" id="type" selected="false" />
<filter-element type="OBJECT" id="dimension" selected="false" />
<filter-element type="OBJECT" id="cluster" selected="false" />
<filter-element type="OBJECT" id="dblink" selected="false" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</basic-filter>
<extended-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</extended-filter>
</filters>
<sorting enabled="true">
<sorting-element type="RESERVED_WORD" id="keyword" />
<sorting-element type="RESERVED_WORD" id="datatype" />
<sorting-element type="OBJECT" id="column" />
<sorting-element type="OBJECT" id="table" />
<sorting-element type="OBJECT" id="view" />
<sorting-element type="OBJECT" id="materialized view" />
<sorting-element type="OBJECT" id="index" />
<sorting-element type="OBJECT" id="constraint" />
<sorting-element type="OBJECT" id="trigger" />
<sorting-element type="OBJECT" id="synonym" />
<sorting-element type="OBJECT" id="sequence" />
<sorting-element type="OBJECT" id="procedure" />
<sorting-element type="OBJECT" id="function" />
<sorting-element type="OBJECT" id="package" />
<sorting-element type="OBJECT" id="type" />
<sorting-element type="OBJECT" id="dimension" />
<sorting-element type="OBJECT" id="cluster" />
<sorting-element type="OBJECT" id="dblink" />
<sorting-element type="OBJECT" id="schema" />
<sorting-element type="OBJECT" id="role" />
<sorting-element type="OBJECT" id="user" />
<sorting-element type="RESERVED_WORD" id="function" />
<sorting-element type="RESERVED_WORD" id="parameter" />
</sorting>
<format>
<enforce-code-style-case value="true" />
</format>
</code-completion-settings>
<execution-engine-settings>
<statement-execution>
<fetch-block-size value="100" />
<execution-timeout value="20" />
<debug-execution-timeout value="600" />
<focus-result value="false" />
<prompt-execution value="false" />
</statement-execution>
<script-execution>
<command-line-interfaces />
<execution-timeout value="300" />
</script-execution>
<method-execution>
<execution-timeout value="30" />
<debug-execution-timeout value="600" />
<parameter-history-size value="10" />
</method-execution>
</execution-engine-settings>
<operation-settings>
<transactions>
<uncommitted-changes>
<on-project-close value="ASK" />
<on-disconnect value="ASK" />
<on-autocommit-toggle value="ASK" />
</uncommitted-changes>
<multiple-uncommitted-changes>
<on-commit value="ASK" />
<on-rollback value="ASK" />
</multiple-uncommitted-changes>
</transactions>
<session-browser>
<disconnect-session value="ASK" />
<kill-session value="ASK" />
<reload-on-filter-change value="false" />
</session-browser>
<compiler>
<compile-type value="KEEP" />
<compile-dependencies value="ASK" />
<always-show-controls value="false" />
</compiler>
<debugger>
<debugger-type value="ASK" />
<use-generic-runners value="true" />
</debugger>
</operation-settings>
<ddl-file-settings>
<extensions>
<mapping file-type-id="VIEW" extensions="vw" />
<mapping file-type-id="TRIGGER" extensions="trg" />
<mapping file-type-id="PROCEDURE" extensions="prc" />
<mapping file-type-id="FUNCTION" extensions="fnc" />
<mapping file-type-id="PACKAGE" extensions="pkg" />
<mapping file-type-id="PACKAGE_SPEC" extensions="pks" />
<mapping file-type-id="PACKAGE_BODY" extensions="pkb" />
<mapping file-type-id="TYPE" extensions="tpe" />
<mapping file-type-id="TYPE_SPEC" extensions="tps" />
<mapping file-type-id="TYPE_BODY" extensions="tpb" />
</extensions>
<general>
<lookup-ddl-files value="true" />
<create-ddl-files value="false" />
<synchronize-ddl-files value="true" />
<use-qualified-names value="false" />
<make-scripts-rerunnable value="true" />
</general>
</ddl-file-settings>
<general-settings>
<regional-settings>
<date-format value="MEDIUM" />
<number-format value="UNGROUPED" />
<locale value="SYSTEM_DEFAULT" />
<use-custom-formats value="false" />
</regional-settings>
<environment>
<environment-types>
<environment-type id="development" name="Development" description="Development environment" color="-2430209/-12296320" readonly-code="false" readonly-data="false" />
<environment-type id="integration" name="Integration" description="Integration environment" color="-2621494/-12163514" readonly-code="true" readonly-data="false" />
<environment-type id="production" name="Production" description="Productive environment" color="-11574/-10271420" readonly-code="true" readonly-data="true" />
<environment-type id="other" name="Other" description="" color="-1576/-10724543" readonly-code="false" readonly-data="false" />
</environment-types>
<visibility-settings>
<connection-tabs value="true" />
<dialog-headers value="true" />
<object-editor-tabs value="true" />
<script-editor-tabs value="false" />
<execution-result-tabs value="true" />
</visibility-settings>
</environment>
</general-settings>
</component>
<component name="DBNavigator.Project.StatementExecutionManager">
<execution-variables />
</component>
</project>

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetDropDown">
<runningDeviceTargetSelectedWithDropDown>
<Target>
<type value="RUNNING_DEVICE_TARGET" />
<deviceKey>
<Key>
<type value="SERIAL_NUMBER" />
<value value="emulator-5554" />
</Key>
</deviceKey>
</Target>
</runningDeviceTargetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2022-06-02T07:36:08.505054300Z" />
</component>
</project>

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="GRADLE" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>

@ -0,0 +1,145 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DesignSurface">
<option name="filePathToZoomLevelMap">
<map>
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/b_login_identity_choose.xml" value="0.2445" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/bottom_navigation_selector.xml" value="0.208" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/ic_baseline_add_24.xml" value="0.208" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/ic_baseline_add_24_grey.xml" value="0.1845" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/ic_baseline_clear_24.xml" value="0.128" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/ic_baseline_clear_24_red.xml" value="0.128" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24.xml" value="0.189" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24_grey.xml" value="0.188" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/ic_baseline_lock_24.xml" value="0.1795" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/ic_baseline_person_24.xml" value="0.1795" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/ic_baseline_visibility_24.xml" value="0.2175" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/ic_baseline_visibility_off_24.xml" value="0.2325" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/ic_launcher_background.xml" value="0.229" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/layerlist_inputtext_modify.xml" value="0.194" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/pb_login_loading.xml" value="0.2195" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_bottm_modify_info_save.xml" value="0.213" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_bottom_add_course.xml" value="0.1915" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_bottom_modify_info_save.xml" value="0.1955" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_bottom_modify_info_save_1.xml" value="0.194" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_bottom_modify_info_save_2.xml" value="0.159" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_bottom_my_info.xml" value="0.152" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_bottom_navigation.xml" value="0.213" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_float_bottom.xml" value="0.1795" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_float_bottom_background.xml" value="0.1795" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_home_bt_sign.xml" value="0.17" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_inputText_modify_msg.xml" value="0.1965" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_input_text_add_course.xml" value="0.1845" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_input_text_modify_msg.xml" value="0.1965" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_inputtext_modify_msg.xml" value="0.194" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_my_info_about.xml" value="0.2425" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_my_info_detail.xml" value="0.1735" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_my_info_title.xml" value="0.2425" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_navigation_bottom.xml" value="0.1825" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_text_course.xml" value="0.18" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_time_choose.xml" value="0.1915" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_top_nav.xml" value="0.1775" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/drawable/selector_top_nav_item_background.xml" value="0.1775" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/actiivity_all_course.xml" value="0.12335359675785208" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/action_login_stu.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/action_login_tea.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_all_course.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_choose_course.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_course_detail.xml" value="0.21354166666666666" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_detail_about.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_detail_my_info.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_detail_record.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_detail_setting.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_home_stu.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_img_get.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_login.xml" value="0.264" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_login_identity_choose.xml" value="0.264" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_login_stu.xml" value="0.264" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_login_tea.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_main.xml" value="0.264" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_main_stu.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_main_tea.xml" value="0.264" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_map.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_modify_user_info.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_register.xml" value="0.264" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_register_stu.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_scan.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_scan_code.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_stu_course_sign_in.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_stu_detail_my_info.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_stu_detail_record.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_stu_detail_setting.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_tea_check_course_sign.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_tea_create_course.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_tea_create_sign.xml" value="1.0" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_tea_detail_about.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_tea_detail_my_info.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_tea_detail_record.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_tea_detail_setting.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_user_detail_my_info.xml" value="0.264" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_user_detail_record.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/activity_user_detail_setting.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/blank_fragment.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/bottom_navigation_view.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/card_class_list.xml" value="0.264" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/card_class_list_stu.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/card_class_list_tea.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/card_class_msg.xml" value="0.264" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/card_class_unsigned_msg.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/card_course.xml" value="0.2" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/card_course_name_list.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/card_course_stu.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/card_course_tea.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/card_img_listview.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/card_list_tea.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/card_location_poi.xml" value="0.21472663139329806" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/card_my_info_record.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/content_home_activity_stu.xml" value="0.17346014492753623" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/dialog_input.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_class_list.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_course_class_list.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_course_finished.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_course_intro_msg.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_course_selected_stu.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_course_unfinished.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_first.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_home.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_my_info.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_second.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_sign_list.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_stu_class_list.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_stu_class_msg.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_stu_home.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_stu_my_info.xml" value="0.264" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_tea_class_list.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_tea_class_msg.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_tea_course_list.xml" value="0.536" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_tea_home.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_tea_my_info.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/fragment_user_my_info.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/home_activity_stu.xml" value="0.264" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/home_activity_tea.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/item_course_list.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/item_stu_signed.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/login_indentity_choose.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/layout/nav_activity_stu.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/menu/bottom_app_bar.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/menu/bottom_nav_menu.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/menu/bottom_nav_menu_tea.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/menu/bottom_navigation_menu.xml" value="0.264" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/menu/bottom_stu_nav_menu.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/menu/bottom_tea_nav_menu.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/menu/mobile_navigation.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/menu/top_app_bar.xml" value="0.25364583333333335" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml" value="0.229" />
<entry key="..\:/CourseDesign/androidDevelopment/code/final/S.T.Link/app/src/main/res/xml/filepaths.xml" value="0.23072916666666668" />
</map>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

Binary file not shown.

1
app/.gitignore vendored

@ -0,0 +1 @@
/build

@ -0,0 +1,92 @@
plugins {
id 'com.android.application'
}
android {
compileSdk 31
defaultConfig {
applicationId "com.example.stlink"
minSdk 21
targetSdk 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk {
// SOso
abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86","x86_64"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
buildFeatures {
viewBinding true
}
sourceSets {
main {
jniLibs.srcDir 'libs'
}
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.navigation:navigation-fragment:2.3.5'
implementation 'androidx.navigation:navigation-ui:2.3.5'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
implementation files('libs\\BaiduLBS_Android.jar')
implementation 'androidx.test:monitor:1.4.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'com.google.android.material:material:1.6.0'
implementation "androidx.viewpager2:viewpager2:1.0.0"
def nav_version = "2.1.0"
implementation "androidx.navigation:navigation-fragment:$nav_version"
implementation "androidx.navigation:navigation-ui:$nav_version"
// Java language implementation
implementation "androidx.fragment:fragment:1.4.1"
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.github.bumptech.glide:glide:4.11.0'
// https://mvnrepository.com/artifact/org.ligboy.retrofit2/converter-fastjson-android
implementation 'org.ligboy.retrofit2:converter-fastjson-android:2.1.0'
//
implementation 'com.github.donkingliang:ImageSelector:2.2.1'
//
implementation 'gdut.bsx:xdraglayout:1.1.1'
//
// https://mvnrepository.com/artifact/com.google.zxing/core
implementation 'com.google.zxing:core:3.5.0'
implementation 'com.journeyapps:zxing-android-embedded:4.1.0'
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

Binary file not shown.

@ -0,0 +1,26 @@
package com.example.stlink;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.example.stlink", appContext.getPackageName());
}
}

@ -0,0 +1,118 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.stlink">
<!--获取网路请求权限,访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 获取手机外部存储读写权限,写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28"
tools:ignore="ScopedStorage"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!-- 手机照片访问权限,调用相机权限 -->
<uses-permission android:name="android.permission.CAMERA"/>
<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- 用于访问wifi网络信息wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 这个权限用于获取wifi的获取权限wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-sdk tools:overrideLibrary="com.google.zxing.client.android" />
<application
android:name=".configs.MapApplication"
android:allowBackup="true"
android:icon="@mipmap/logo"
android:label="@string/app_name"
android:roundIcon="@mipmap/logo"
android:supportsRtl="true"
android:theme="@style/Theme.STLink"
android:networkSecurityConfig="@xml/network_security_config"
android:requestLegacyExternalStorage="true"
android:largeHeap="true">
<!--百度定位AK-->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="Aqpm9VxPiwA42bNGm9GXp55mMl8bWxwW" >
</meta-data>
<!--百度定位服务-->
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"/>
<provider
android:authorities="com.example.stlink.fileProvider"
android:name="androidx.core.content.FileProvider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
<!-- 调整二维码扫描界面为竖屏 -->
<activity
android:name="com.journeyapps.barcodescanner.CaptureActivity"
android:screenOrientation="portrait"
tools:replace="screenOrientation" />
<!-- 开机加载动画 -->
<activity
android:name=".LaunchActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 登录身份选择 -->
<activity android:name=".activitys.IdChooseActivity" />
<!-- login界面 -->
<activity android:name=".activitys.LoginActivity" />
<!-- register界面 -->
<activity android:name=".activitys.RegisterActivity"/>
<!-- 主页面 -->
<activity android:name=".activitys.MainActivity" />
<activity android:name=".activitys.fragmentChild.activityStuHome.AllCourses"/>
<!-- 用户信息相关 -->
<activity android:name=".activitys.fragmentChild.activityUserInfo.UserInfoSetting"/>
<activity android:name=".activitys.fragmentChild.activityUserInfo.UserInfoAbout"/>
<activity android:name=".activitys.fragmentChild.activityUserInfo.UserInfoRecord"/>
<activity android:name=".activitys.fragmentChild.activityUserInfo.UserInfoDetail"/>
<activity android:name=".activitys.fragmentChild.activityUserInfo.ModifyUserInfo"/>
<activity android:name=".activitys.fragmentChild.activityTeaHome.CreateCourse"/>
<activity android:name=".activitys.fragmentChild.activityTeaCourse.CourseDetail"/>
<activity android:name=".activitys.fragmentChild.activityTeaHome.CreateSign"/>
<activity android:name=".activitys.fragmentChild.activityTeaHome.ChooseCourse"/>
<activity android:name=".activitys.fragmentChild.activityTeaHome.CheckCourseSign"/>
<activity android:name=".activitys.fragmentChild.activityStuClassList.CourseSignIn"/>
<!--图片选择Activity-->
<activity android:name="com.donkingliang.imageselector.ImageSelectorActivity"
android:configChanges="orientation|keyboardHidden|screenSize"/>
<!--图片预览Activity-->
<activity android:name="com.donkingliang.imageselector.PreviewActivity"
android:configChanges="orientation|keyboardHidden|screenSize"/>
<!--图片剪切Activity-->
<activity
android:name="com.donkingliang.imageselector.ClipImageActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
<activity android:name=".activitys.MapActivity"/>
</application>
</manifest>

@ -0,0 +1,69 @@
package com.example.stlink;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.widget.ImageView;
import com.example.stlink.activitys.IdChooseActivity;
import com.example.stlink.utils.CommonUtils;
/**
* app
*/
public class LaunchActivity extends AppCompatActivity {
private ImageView mClipLeftLoadingImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launch);
// //去除当前活动标题栏
// Objects.requireNonNull(getSupportActionBar()).hide();
mClipLeftLoadingImageView = findViewById(R.id.iv_login_loading);
mClipLeftLoadingImageView.setImageLevel(0);
//修改状态栏字体颜色
CommonUtils.changeStatusBar(this);
// //延时任务,进度条加载
// handler.postDelayed(runnable, 500);
//延时加载
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(LaunchActivity.this, IdChooseActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}, 1000);//3秒后执行Runnable中的run方法
}
// //开启一个子线程用作进度条加载
// private int mUnmber = 0;
// private Handler handler = new Handler();
// Runnable runnable = new Runnable() {
// @Override
// public void run() {
// if(mUnmber <= 10000){
// mClipLeftLoadingImageView.getDrawable().setLevel(mUnmber);
// handler.postDelayed(runnable, 20);
// mUnmber += 100;
// }
//
// //进度条加载完毕之后,跳转到身份选择活动
// Intent intent = new Intent(LaunchActivity.this, IdChooseActivity.class);
// startActivity(intent);
// }
// };
}

@ -0,0 +1,134 @@
package com.example.stlink.activitys;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.example.stlink.R;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.utils.CommonUtils;
/**
*
*/
public class IdChooseActivity extends AppCompatActivity {
private Boolean isExit = false; // 定义一个变量,来标识是否退出
Handler mHandler; // 3秒内连续点击两个退出键返回
private Button stuLoginCho;
private Button teaLoginCho;
private Bundle bundle;
private Intent intentIdCho;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login_identity_choose);
initView();
// 消息延时处理将退出标志设置未为false
mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
isExit = false;
}
};
}
/**
*
*/
public void initView(){
//修改状态栏字体颜色
CommonUtils.changeStatusBar(this);
stuLoginCho = findViewById(R.id.login_b_stu);
teaLoginCho = findViewById(R.id.login_b_tea);
bundle = new Bundle();
setOnclickListener();
}
/**
*
*/
public void setOnclickListener(){
// 选择学生端登录
stuLoginCho.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
intentIdCho = new Intent(IdChooseActivity.this, LoginActivity.class);
bundle.putInt(ModelFieldConstants.ROLE_ID, 0);
intentIdCho.putExtras(bundle);
startActivity(intentIdCho);
}
});
// 选择教师端登录
teaLoginCho.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
intentIdCho = new Intent(IdChooseActivity.this, LoginActivity.class);
bundle.putInt(ModelFieldConstants.ROLE_ID, 1);
intentIdCho.putExtras(bundle);
startActivity(intentIdCho);
}
});
}
/**
* 1BACKonKeyDownBACKexit
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){
exit();
return false;
}
return super.onKeyDown(keyCode, event);
}
/**
* 2exitisExitfalsetrue
* 30003Handlerfalse
* 2BACKexitisExit
* true退
*/
public void exit(){
if (!isExit) {
isExit = true;
Toast toast = Toast.makeText(getApplicationContext(),"再按一次退出程序",Toast.LENGTH_SHORT);
toast.show();
toast.setGravity(Gravity.CENTER, 0, 0);
//利用handler延迟发送更改状态信息3000==3
mHandler.sendEmptyMessageDelayed(0, 3000);
} else {
//在后台运行程序,不退出程序,只返回桌面
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
//退出程序代码
// finish(); //结束程序
// System.exit(0); //退出程序
}
}
}

@ -0,0 +1,136 @@
package com.example.stlink.activitys;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.example.stlink.R;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.utils.CommonUtils;
import com.example.stlink.utils.activityUtil.LoginUtil;
/**
*
*/
public class LoginActivity extends AppCompatActivity {
private EditText etPwd;
private EditText etAccount;
private CheckBox cbRememberPwd;
private Button btLogin;
private TextView lgRegister;
private TextView tvLgTitle;
private ImageView lgUserIcon;
private Integer roleId;
private Bundle bundle;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initView();
}
/**
*
*/
private void initView(){
//修改状态栏字体颜色
CommonUtils.changeStatusBar(this);
etPwd = findViewById(R.id.pwd_lg);
etAccount = findViewById(R.id.id_lg);
cbRememberPwd = findViewById(R.id.lg_rememberPsd);
btLogin = findViewById(R.id.bt_login);
lgRegister = findViewById(R.id.lg_register);
tvLgTitle = findViewById(R.id.tv_lg_title);
lgUserIcon = findViewById(R.id.lg_userIcon);
bundle = getIntent().getExtras();
roleId = (Integer) bundle.get(ModelFieldConstants.ROLE_ID);
if(roleId == 1){
tvLgTitle.setText("教师端登录");
lgUserIcon.setImageResource(R.mipmap.teacher);
}
//加载用户id密码到页面
initLogin(etAccount, etPwd, cbRememberPwd);
//为当前页面按钮添加点击监听事件
setOnclickListener();
}
/**
*
*/
private void setOnclickListener(){
LoginUtil.userLogin(LoginActivity.this, btLogin, etAccount, etPwd, cbRememberPwd );
//用户注册
lgRegister.setOnClickListener(new View.OnClickListener() {
@SuppressLint("ResourceAsColor")
@Override
public void onClick(View v) {
lgRegister.setTextColor(R.color.crimson);
lgRegister.getPaint().setUnderlineText(true);
Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
intent.putExtras(bundle);
startActivity(intent);
}
});
}
/**
*
*
* @param etAccount
* @param etPwd
* @param cbRememberPwd
*/
public void initLogin(EditText etAccount, EditText etPwd, CheckBox cbRememberPwd){
String spFileName = getResources()
.getString(R.string.shared_preferences_file_name);
String accountKey = getResources()
.getString(R.string.login_account_name);
String passwordKey = getResources()
.getString(R.string.login_password);
String rememberPasswordKey = getResources()
.getString(R.string.login_remember_password);
SharedPreferences spFile = getSharedPreferences(
spFileName,
Context.MODE_PRIVATE
);
String account = spFile.getString(accountKey, null);
String password = spFile.getString(passwordKey, null);
Boolean rememberPassword = spFile.getBoolean(rememberPasswordKey, false);
if(account != null && !TextUtils.isEmpty(account)){
etAccount.setText(account);
etAccount.setSelection(account.length());
}
if (password != null && !TextUtils.isEmpty(password)) {
etPwd.setText(CommonUtils.encryptAndDencrypt(password));
}
cbRememberPwd.setChecked(rememberPassword);
}
}

@ -0,0 +1,97 @@
package com.example.stlink.activitys;
import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Bundle;
import android.view.KeyEvent;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import com.example.stlink.R;
import com.example.stlink.fragments.StuClassListFragment;
import com.example.stlink.fragments.StuHomeFragment;
import com.example.stlink.fragments.TeaCourseListFragment;
import com.example.stlink.fragments.TeaHomeFragment;
import com.example.stlink.fragments.UserInfoFragment;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.utils.activityUtil.MainActivityUtil;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private MainActivityUtil mainActivityUtil;
private BottomNavigationView bottomNavigationView;
private Integer roleId;
private Bundle bundle;
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initPager();
}
@RequiresApi(api = Build.VERSION_CODES.O)
@SuppressLint("RestrictedApi")
private void initView(){
bottomNavigationView = findViewById(R.id.bottom_navigation_view);
mainActivityUtil = new MainActivityUtil(this);
mainActivityUtil.initView();
bundle = getIntent().getExtras();
roleId = (Integer) bundle.get(ModelFieldConstants.ROLE_ID);
if(roleId == 0){
bottomNavigationView.getMenu().getItem(2).setIcon(R.mipmap.student);
bottomNavigationView.getMenu().getItem(1).setTitle("班级消息");
}
}
/**
*
*/
private void initPager(){
List<Fragment> list = new ArrayList<>();
if(roleId == 1){
TeaHomeFragment teaHomeFragment = TeaHomeFragment.newInstance("主页",this,findViewById(R.id.nav_host_fragment));
TeaCourseListFragment teaCourseListFragment = TeaCourseListFragment.newInstance("班级消息", this);
list.add(teaHomeFragment);
list.add(teaCourseListFragment);
}else{
StuHomeFragment stuHomeFragment = StuHomeFragment.newInstance("主页");
StuClassListFragment stuClassListFragment = StuClassListFragment.newInstance("班级消息", MainActivity.this);
list.add(stuHomeFragment);
list.add(stuClassListFragment);
}
UserInfoFragment teaInfoFragment = UserInfoFragment.newInstance("个人信息", MainActivity.this);
list.add(teaInfoFragment);
mainActivityUtil.initPager(list);
}
/**
* 1BACKonKeyDownBACKexit
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){
mainActivityUtil.setExit();
return false;
}
return super.onKeyDown(keyCode, event);
}
}

@ -0,0 +1,317 @@
package com.example.stlink.activitys;
import android.annotation.SuppressLint;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.ZoomControls;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatButton;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
import com.example.stlink.R;
import com.example.stlink.configs.adapter.LocationPoiAdapter;
import com.example.stlink.configs.onRecyclerViewItemClickListener;
import com.example.stlink.fragments.StuHomeFragment;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.utils.MyLocationListener;
import java.util.ArrayList;
import java.util.List;
public class MapActivity extends AppCompatActivity {
private MapView mMapView = null;
private BaiduMap mBaiduMap = null;
private LocationClient mLocationClient = null;
BitmapDescriptor bitmap = null;
private ImageView ivRelocation;
private ImageButton abBtReturn;
private AppCompatButton abBtSave;
private MyLocationListener myLocationListener;
private BDLocation nowLocation;
private RecyclerView mRecyclerView;
private LocationPoiAdapter adapter;
private List<PoiInfo> mList;
private Handler myLocationListenerHandler;
private Handler locationPoiHandler;
private onRecyclerViewItemClickListener recyclerViewItemClickListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
LocationClient.setAgreePrivacy(true);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
initView();
}
@Override
protected void onResume() {
mMapView.onResume();
super.onResume();
}
@Override
protected void onPause() {
mMapView.onPause();
super.onPause();
}
@Override
protected void onDestroy() {
mLocationClient.stop();
mBaiduMap.setMyLocationEnabled(false);
MyLocationListener.isFirstLocate = true;
mMapView.onDestroy();
mMapView = null;
super.onDestroy();
}
/**
*
*/
private void initView(){
//获取布局相关控件
mMapView = findViewById(R.id.b_map_view);
ivRelocation = findViewById(R.id.iv_relocation);
abBtReturn = findViewById(R.id.ab_bt_return);
abBtSave = findViewById(R.id.ab_bt_save);
bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.location);
mRecyclerView= findViewById(R.id.rv_msg);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
locationPoiHandler = new Handler(new Handler.Callback() {
@SuppressLint("NotifyDataSetChanged")
@Override
public boolean handleMessage(@NonNull Message msg) {
if(msg.arg1 == 1){
adapter=new LocationPoiAdapter(MapActivity.this,mList);
mRecyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
adapter.setOnItemClickListener(recyclerViewItemClickListener);
}
return false;
}
});
myLocationListenerHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
nowLocation = myLocationListener.getLocation();
if(msg.arg1 == 200 && nowLocation != null){
LatLng point = new LatLng(nowLocation.getLatitude(), nowLocation.getLongitude());
System.out.println("reverseGeocoding: start!!!!!!!!!!!!");
//单次定位结束,销毁定位
System.out.println("mBaiduMap:closing................");
mLocationClient.stop();
//关闭定位图层
// mBaiduMap.setMyLocationEnabled(false);
//开始地理反编码
reverseGeocoding(point);
}else{
System.out.println("mLocationClient : " + mLocationClient.toString());
System.out.println("nowLocation : " + nowLocation);
}
return false;
}
});
// 得到地图
mBaiduMap = mMapView.getMap();
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
//设置默认放大倍数
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().zoom(20).build()));
mMapView.getMap().setMaxAndMinZoomLevel(21, 19);
//定位初始化
try {
mLocationClient = new LocationClient(MapActivity.this);
} catch (Exception e) {
e.printStackTrace();
}
// 隐藏logo
View child = mMapView.getChildAt(1);
if ((child instanceof ImageView || child instanceof ZoomControls)){
child.setVisibility(View.INVISIBLE);
}
//隐藏放大缩小控件
mMapView.showZoomControls(false);
//通过LocationClientOption设置LocationClient相关参数
LocationClientOption locationClientOption = new LocationClientOption();
// 可选,设置定位模式,默认高精度 LocationMode.Hight_Accuracy高精度
locationClientOption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
locationClientOption.setOpenGps(true); // 打开gps
locationClientOption.setCoorType("bd09ll"); // 设置坐标类型
locationClientOption.setScanSpan(1000);//可选默认0即仅定位一次设置发起定位请求的间隔需要大于等于1000ms才是有效的
// 可选,设置地址信息
locationClientOption.setIsNeedAddress(true);
locationClientOption.setIsEnableBeidouMode(true);
//可选,设置是否需要地址描述
locationClientOption.setIsNeedLocationDescribe(true);
//设置locationClientOption
mLocationClient.setLocOption(locationClientOption);
//注册LocationListener监听器, 获取本地定位
myLocationListener = new MyLocationListener(mMapView, mBaiduMap, myLocationListenerHandler);
mLocationClient.registerLocationListener(myLocationListener);
//开启地图定位图层
mLocationClient.start();
//设置其他监听事件
setOtherListener();
}
/**
*
* @param point
*/
private void reverseGeocoding(LatLng point){
//实例化一个地理编码查询对象
GeoCoder geoCoder = GeoCoder.newInstance();
//设置反地理编码位置坐标
ReverseGeoCodeOption op = new ReverseGeoCodeOption();
op.location(point);
op.pageSize(1);
//发起反地理编码请求(经纬度->地址信息)
geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
if (geoCodeResult == null
|| geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(getApplicationContext(), "没有检测到结果", Toast.LENGTH_SHORT).show();
}
}
@SuppressLint("NotifyDataSetChanged")
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
if (reverseGeoCodeResult == null
|| reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(getApplicationContext(), "没有检测到结果", Toast.LENGTH_SHORT).show();
} else {
System.out.println("reverseGeocoding: success!!!!!!!!!!!!");
reverseGeoCodeResult.getPoiList();
mList = (ArrayList<PoiInfo>) reverseGeoCodeResult.getPoiList();
System.out.println("mList : " + mList);
Message message = new Message();
message.arg1 = 1;
//发送消息,将反编码结果刷新到布局上
locationPoiHandler.sendMessage(message);
}
}
});
geoCoder.reverseGeoCode(op);
// 释放实例
geoCoder.destroy();
}
/**
*
*/
private void setOtherListener(){
//重定位
ivRelocation.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//点击重定位按钮,启动定位
System.out.println("mBaiduMap:starting................");
mLocationClient.start();
//开启定位图层
// mBaiduMap.setMyLocationEnabled(true);
// BDLocation nowLocation = myLocationListener.getLocation();
// LatLng ll = new LatLng(nowLocation.getLatitude(), nowLocation.getLongitude());
// MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(ll);
// mBaiduMap.animateMapStatus(msu);
}
});
abBtReturn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
//保存
abBtSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
nowLocation = myLocationListener.getLocation();
String ll = "(" + nowLocation.getLatitude() + "," + nowLocation.getLongitude() + ")";
Intent intent = new Intent();
Bundle bundle = getIntent().getExtras();
bundle.putString(ModelFieldConstants.LOCATION, ll);
intent.putExtras(bundle);
setResult(100,intent);
finish();
}
});
recyclerViewItemClickListener = new onRecyclerViewItemClickListener() {
@Override
public void onItemClick(RecyclerView parent, View view, int position) {
PoiInfo poiInfo = mList.get(position);
AlertDialog alertDialog2 = new AlertDialog.Builder(MapActivity.this)
.setMessage("签到地点【" + poiInfo.name + "】")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {//添加"Yes"按钮
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Intent intent = new Intent();
Bundle bundle = getIntent().getExtras();
bundle.putString(ModelFieldConstants.LOCATION, poiInfo.name);
intent.putExtras(bundle);
setResult(100,intent);
finish();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {//添加取消
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
})
.create();
alertDialog2.show();
}
@Override
public void onItemLongClick(RecyclerView parent, View view, int position) { }
};
}
}

@ -0,0 +1,81 @@
package com.example.stlink.activitys;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.example.stlink.R;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.utils.CommonUtils;
import com.example.stlink.utils.activityUtil.RegisterUtil;
/**
*
*/
public class RegisterActivity extends AppCompatActivity {
private TextView tvRgTitle;
private ImageView ivRgUserImg;
private EditText teaAccount;
private EditText teaPwdFirst;
private EditText teaPwdSecond;
private Button btRegister;
private Integer roleId;
private Bundle bundle;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
initView();
}
/**
*
*/
private void initView(){
//修改状态栏字体颜色
CommonUtils.changeStatusBar(this);
teaAccount = findViewById(R.id.id_rg);
teaPwdFirst = findViewById(R.id.pwd_rg_first);
teaPwdSecond = findViewById(R.id.pwd_rg_second);
tvRgTitle = findViewById(R.id.tv_rg_title);
ivRgUserImg = findViewById(R.id.rg_user_title_img);
bundle = getIntent().getExtras();
roleId = (Integer) bundle.get(ModelFieldConstants.ROLE_ID);
if(roleId == 1){
tvRgTitle.setText("教师端注册");
ivRgUserImg.setImageResource(R.mipmap.teacher);
}
btRegister = findViewById(R.id.bt_register);
setOnClickListener();
}
/**
*
*/
private void setOnClickListener(){
//为注册按钮添加点击监听事件
RegisterUtil.userRegister(
RegisterActivity.this,
btRegister,
teaAccount,
teaPwdFirst,
teaPwdSecond
);
}
}

@ -0,0 +1,22 @@
package com.example.stlink.activitys;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.example.stlink.R;
public class ScanQRCodeActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan_code);
}
private void initView(){
}
}

@ -0,0 +1,343 @@
package com.example.stlink.activitys.fragmentChild.activityStuClassList;
import android.annotation.SuppressLint;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.alibaba.fastjson.JSON;
import com.example.stlink.R;
import com.example.stlink.activitys.ScanQRCodeActivity;
import com.example.stlink.configs.adapter.StuCourseSignedAdapter;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.model.constants.UrlConstants;
import com.example.stlink.model.domain.CourseSign;
import com.example.stlink.model.request.StuSignRequest;
import com.example.stlink.model.response.BaseResponse;
import com.example.stlink.model.response.data.CourseData;
import com.example.stlink.utils.CommonUtils;
import com.example.stlink.utils.httpUtils.GetUrlParamHttpUtils;
import com.example.stlink.utils.httpUtils.PostBodyParamHttpUtils;
import com.google.android.material.textfield.TextInputEditText;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.internal.LinkedTreeMap;
import com.google.gson.reflect.TypeToken;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import java.util.ArrayList;
import java.util.List;
public class CourseSignIn extends AppCompatActivity {
private ImageView abIvTitle;
private TextView tvCreateTimeMsg;
private TextView tvSignAddressMsg;
private TextView tvCourseName;
private Button btSign;
private TextView tvSignRecord;
private RecyclerView rvStuCourseList;
private TextInputEditText etCodeInput;
private static List<CourseSign> courseHasSignedList;
private static StuCourseSignedAdapter adapter;
private Handler signHandler;
private Handler getSignedHandler;
private Bundle bundle;
private String signCodeStr;
private long courseSignId;
private long courseId;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_stu_course_sign_in);
initView();
}
private void initView(){
CommonUtils.changeStatusBar(CourseSignIn.this);
abIvTitle = findViewById(R.id.ab_iv_title);
tvCreateTimeMsg = findViewById(R.id.tv_create_time_msg);
tvSignAddressMsg = findViewById(R.id.tv_sign_address_msg);
tvCourseName = findViewById(R.id.tv_course_name);
btSign = findViewById(R.id.bt_sign);
tvSignRecord = findViewById(R.id.tv_sign_record);
rvStuCourseList = findViewById(R.id.rv_stu_course_list);
setClickListener();
refreshData();
}
private void refreshData(){
bundle = getIntent().getExtras();
CourseSign courseSign = (CourseSign) bundle.getSerializable(ModelFieldConstants.COURSE_SIGN);
System.out.println("CourseSignIn:courseSign = " + courseSign);
String courseName = courseSign.getCourseName();
String courseAddr = courseSign.getCourseAddr();
long courseCreateTimeStamp = courseSign.getCreateTime();
courseSignId = courseSign.getUserSignId();
courseId = courseSign.getCourseId();
tvCreateTimeMsg.setText(CommonUtils.stampToDate(String.valueOf(courseCreateTimeStamp), "yyyy-MM-dd hh:mm:ss"));
tvSignAddressMsg.setText(courseAddr);
tvCourseName.setText(courseName);
courseHasSignedList = new ArrayList<>();
adapter = new StuCourseSignedAdapter(
CourseSignIn.this,
R.layout.item_stu_signed,
courseHasSignedList,
0
);
LinearLayoutManager llm = new LinearLayoutManager(CourseSignIn.this);
rvStuCourseList.setLayoutManager(llm);
rvStuCourseList.setAdapter(adapter);
}
private void setClickListener(){
abIvTitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
//点击签到后的事件
btSign.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@SuppressLint("InflateParams")
View view = LayoutInflater.from(CourseSignIn.this).inflate(R.layout.dialog_input, null);
AlertDialog.Builder builder = new AlertDialog.Builder(CourseSignIn.this)
.setMessage("请输入签到口令")
.setView(view)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {//添加"Yes"按钮
@Override
public void onClick(DialogInterface dialogInterface, int i) {
etCodeInput = view.findViewById(R.id.et_code_input);
Editable etSignCode = etCodeInput.getText();
if(etSignCode == null){
Toast.makeText(CourseSignIn.this, "口令为空", Toast.LENGTH_SHORT).show();
}else{
signCodeStr = etSignCode.toString();
int signCode;
StuSignRequest stuSignRequest = new StuSignRequest();
stuSignRequest.setUserSignId(courseSignId);
stuSignRequest.setUserId(bundle.getLong(ModelFieldConstants.ID));
try{
signCode = Integer.parseInt(signCodeStr);
stuSignRequest.setSignCode(signCode);
signHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
if(msg.arg1 == -1){
String errorMsg = (String) msg.obj;
Toast.makeText(CourseSignIn.this, errorMsg, Toast.LENGTH_SHORT).show();
}else if(msg.arg1 == 1){
Toast.makeText(CourseSignIn.this, "签到成功", Toast.LENGTH_SHORT).show();
tvSignRecord.setVisibility(View.VISIBLE);
getSignedHandler = new Handler(new Handler.Callback() {
@SuppressLint("NotifyDataSetChanged")
@Override
public boolean handleMessage(@NonNull Message msg) {
if(msg.arg1 == 1){
adapter.notifyDataSetChanged();
}
return false;
}
});
getHasSignedList();
}
return false;
}
});
signIn(stuSignRequest);
}catch ( NumberFormatException numberFormatException){
Toast.makeText(CourseSignIn.this, "口令输入错误", Toast.LENGTH_SHORT).show();
}
}
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {//添加取消
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
})
.setNeutralButton("扫码", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO 扫码签到
// Intent intent = new Intent(CourseSignIn.this, ScanQRCodeActivity.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// startActivity(intent);
// 创建IntentIntegrator对象
IntentIntegrator intentIntegrator = new IntentIntegrator(CourseSignIn.this)
.setBeepEnabled(true) //扫描提示音
.setPrompt("这是个扫码签到界面")
//.setCaptureActivity(MyCaptureActivity.class) //修改扫码活动
.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE)// 扫码的类型,可选:一维码,二维码,一/二维码
.setTimeout(10000);//15秒未扫描则将自动关闭扫码界面
// 开始扫描
intentIntegrator.initiateScan();
}
});
AlertDialog alertDialog2 = builder.create();
alertDialog2.show();
}
});
}
/**
*
*/
private void getHasSignedList(){
new Thread(new Runnable() {
@Override
public void run() {
bundle = getIntent().getExtras();
String urlParam = ModelFieldConstants.COURSE_ID + "=" + courseId + "&" +
ModelFieldConstants.USER_ID + "=" + bundle.getLong(ModelFieldConstants.ID) + "&" +
ModelFieldConstants.COURSE_SIGN_STATUS + "=" + 1 + "&" +
"current=1&size=10";
String url = UrlConstants.STUDENT_SIGN_LIST + "?" + urlParam;
new GetUrlParamHttpUtils() {
@Override
public void nextMethod(BaseResponse<Object> baseResponse) {
if(baseResponse.getData() != null){
System.out.println("StuClassListFragment:courseDataBaseResponse.getData() = " + baseResponse.getData() + "...............");
//解析数据
Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
Object obj = baseResponse.getData();
LinkedTreeMap<String, String> courseDataMap = null;
if(obj instanceof LinkedTreeMap){
courseDataMap = (LinkedTreeMap<String, String>) obj;
}
//将LinkedTreeMap中字段映射到CourseData类中
//array:学生获取所选课程签到列表返回实体
String jsonString = gson.toJson(courseDataMap);
CourseData<CourseSign> courseData = gson.fromJson(jsonString, new TypeToken<CourseData<CourseSign>>() {}.getType());
if(courseData.getRecords().size() != 0){
courseHasSignedList.addAll(courseData.getRecords());
System.out.println("Here.............................");
Message message = new Message();
message.arg1 = 1;
getSignedHandler.sendMessage(message);
}
}
}
@Override
public void failedMethod(BaseResponse<Object> baseResponse) { }
}.getConnect(url);
}
}).start();
}
/**
*
* @param stuSignRequest
*/
private void signIn(StuSignRequest stuSignRequest){
new Thread(new Runnable() {
@Override
public void run() {
System.out.println( "CourseSignIn:stuSignRequest : " + stuSignRequest.toString());
String json = JSON.toJSONString(stuSignRequest);
String url = UrlConstants.STUDENT_SIGN;
new PostBodyParamHttpUtils() {
@Override
public void nextMethod(BaseResponse<Object> baseResponse) {
Message message = new Message();
message.arg1 = 1;
signHandler.sendMessage(message);
}
@Override
public void failedMethod(BaseResponse<Object> baseResponse) {
Message message = new Message();
message.arg1 = -1;
message.obj = baseResponse.getMsg();
signHandler.sendMessage(message);
}
}.postConnect(url, json);
}
}).start();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 获取解析结果
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (result != null) {
if (result.getContents() == null) {
Toast.makeText(this, "取消扫描", Toast.LENGTH_LONG).show();
} else {
String signCodeStr = result.getContents();
int signCode;
StuSignRequest stuSignRequest = new StuSignRequest();
stuSignRequest.setUserSignId(courseSignId);
stuSignRequest.setUserId(bundle.getLong(ModelFieldConstants.ID));
try{
signCode = Integer.parseInt(signCodeStr);
stuSignRequest.setSignCode(signCode);
signHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
if(msg.arg1 == -1){
String errorMsg = (String) msg.obj;
Toast.makeText(CourseSignIn.this, errorMsg, Toast.LENGTH_SHORT).show();
}else if(msg.arg1 == 1){
Toast.makeText(CourseSignIn.this, "签到成功", Toast.LENGTH_SHORT).show();
tvSignRecord.setVisibility(View.VISIBLE);
getSignedHandler = new Handler(new Handler.Callback() {
@SuppressLint("NotifyDataSetChanged")
@Override
public boolean handleMessage(@NonNull Message msg) {
if(msg.arg1 == 1){
adapter.notifyDataSetChanged();
}
return false;
}
});
getHasSignedList();
}
return false;
}
});
signIn(stuSignRequest);
}catch ( NumberFormatException numberFormatException){
Toast.makeText(CourseSignIn.this, "口令输入错误", Toast.LENGTH_SHORT).show();
}
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
}

@ -0,0 +1,177 @@
package com.example.stlink.activitys.fragmentChild.activityStuHome;
import android.annotation.SuppressLint;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.example.stlink.R;
import com.example.stlink.configs.adapter.StuAddCourseAdapter;
import com.example.stlink.configs.onRecyclerViewItemClickListener;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.model.constants.UrlConstants;
import com.example.stlink.model.domain.Course;
import com.example.stlink.model.response.BaseResponse;
import com.example.stlink.model.response.data.CourseData;
import com.example.stlink.utils.httpUtils.GetUrlParamHttpUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.internal.LinkedTreeMap;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
import java.util.List;
public class AllCourses extends AppCompatActivity {
private RecyclerView lvAllCourse;
private List<Course> coursesData;
private StuAddCourseAdapter adapter;
private ImageView abIvTitle;
private static SwipeRefreshLayout srlMyRefresh;
private static Bundle bundle;
private static Handler handler;
private int page = 1;
private int mCurrentColIndex = 0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_all_course);
initView();
refreshData();
}
/**
*
*/
private void initView(){
lvAllCourse = findViewById(R.id.lv_all_course_list);
abIvTitle = findViewById(R.id.ab_iv_title);
srlMyRefresh = findViewById(R.id.srl_my_refresh);
srlMyRefresh.setColorSchemeColors(Color.parseColor("#ff0000"),Color.parseColor("#00ff00"));
}
/**
*
*/
public void refreshData(){
coursesData = new ArrayList<>();
adapter = new StuAddCourseAdapter(
AllCourses.this,
R.layout.card_course_stu,
coursesData,
0
);
LinearLayoutManager llm = new LinearLayoutManager(AllCourses.this);
lvAllCourse.setLayoutManager(llm);
lvAllCourse.setAdapter(adapter);
bundle = getIntent().getExtras();
handler = new Handler(Looper.getMainLooper()){
@SuppressLint("NotifyDataSetChanged")
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
CourseData courseData = (CourseData) msg.obj;
coursesData.addAll(courseData.getRecords());
adapter.notifyDataSetChanged();
System.out.println("size == " + adapter.getItemCount() + "................................");
}
};
getAllCourseList(10);
setListener();
}
/**
*
*/
public void setListener(){
adapter.setOnItemClickListener(new onRecyclerViewItemClickListener() {
@Override
public void onItemClick(RecyclerView parent, View view, int position) {
}
@Override
public void onItemLongClick(RecyclerView parent, View view, int position) { }
});
abIvTitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
srlMyRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
refreshData();
srlMyRefresh.setRefreshing(false);
}
});
}
/**
* 线
*
* @param page
*/
private void getAllCourseList(final int page){
new Thread(new Runnable() {
final String urlParam = ModelFieldConstants.SIZE + "=" + page + "&" +
ModelFieldConstants.CURRENT + "=" + "1";
final String url = UrlConstants.ALL_COURSE + "?" + urlParam;
@Override
public void run() {
new GetUrlParamHttpUtils() {
@Override
public void nextMethod(BaseResponse<Object> baseResponse) {
System.out.println("courseDataBaseResponse.getData() = " + baseResponse.getData() + "...............");
//解析数据
Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
Object obj = baseResponse.getData();
LinkedTreeMap<String, String> courseDataMap = null;
if(obj instanceof LinkedTreeMap){
courseDataMap = (LinkedTreeMap<String, String>) obj;
}
//将LinkedTreeMap中字段映射到CourseData类中
String jsonString = gson.toJson(courseDataMap);
CourseData<Course> courseData = gson.fromJson(jsonString, new TypeToken<CourseData<Course>>() {}.getType());
System.out.println("courseData = " + courseData);
if(courseData != null){
Message message = new Message();
message.obj = courseData;
handler.sendMessage(message);
}else{
System.out.println("courseData: null " + "...............................");
}
}
@Override
public void failedMethod(BaseResponse<Object> baseResponse) { }
}.getConnect(url);
}
}).start();
}
}

@ -0,0 +1,191 @@
package com.example.stlink.activitys.fragmentChild.activityTeaCourse;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.example.stlink.R;
import com.example.stlink.fragments.CourseClassListFragment;
import com.example.stlink.fragments.CourseIntroMsgFragment;
import com.example.stlink.fragments.CourseSelectedStuFragment;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.model.constants.UrlConstants;
import com.example.stlink.model.response.BaseResponse;
import com.example.stlink.model.response.data.CourseDetailData;
import com.example.stlink.utils.CommonUtils;
import com.example.stlink.utils.activityUtil.CourseDetailUtil;
import com.example.stlink.utils.httpUtils.GetUrlParamHttpUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.internal.LinkedTreeMap;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
import java.util.List;
public class CourseDetail extends AppCompatActivity {
private ImageView abIvTitle;
private TextView abTvCourseName;
private TextView abTvCollegeName;
private TextView abTvTeacherName;
private TextView abTvCourseIdMsg;
private Integer position;
CourseDetailUtil courseDetailUtil;
private Bundle bundle;
private Handler handler;
private CourseDetailData mCourseDetailData;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_course_detail);
initView();
initPager();
}
private void initView(){
//修改状态栏字体颜色
CommonUtils.changeStatusBar(this);
abIvTitle = findViewById(R.id.ab_iv_title);
abTvTeacherName = findViewById(R.id.ab_tv_teacher_name);
abTvCollegeName = findViewById(R.id.ab_tv_college_name);
abTvCourseName = findViewById(R.id.ab_tv_course_name);
abTvCourseIdMsg = findViewById(R.id.ab_tv_course_id_msg);
courseDetailUtil = new CourseDetailUtil(this);
courseDetailUtil.initView();
setListener();
refreshData();
}
private void refreshData(){
bundle = getIntent().getExtras();
handler = new Handler(Looper.getMainLooper()){
@SuppressLint("NotifyDataSetChanged")
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if(msg.arg1 == 200){
CourseDetailData courseDetailData = (CourseDetailData) msg.obj;
mCourseDetailData = courseDetailData;
String courseName = courseDetailData.getCourseName();
String collegeName = courseDetailData.getCollegeName();
String teacherName = courseDetailData.getRealName();
Long idMsg = courseDetailData.getId();
if(teacherName != null){
abTvTeacherName.setText(teacherName);
}
if(collegeName != null){
abTvCollegeName.setText(collegeName);
}
if(courseName != null){
abTvCourseName.setText(courseName);
}
if(idMsg != null){
abTvCourseIdMsg.setText(String.valueOf(idMsg));
}
bundle = getIntent().getExtras();
bundle.putSerializable(ModelFieldConstants.COURSE_DETAIL_DATA, mCourseDetailData);
getIntent().putExtras(bundle);
//在网路请求成功后,回调进行加载数据
CourseIntroMsgFragment.freshData(getIntent());
}else{
System.out.println("msg = " + msg.obj.toString());
}
}
};
getCourseDetail();
}
/**
*
*/
private void setListener(){
abIvTitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
private void initPager(){
List<Fragment> list = new ArrayList<>();
CourseIntroMsgFragment courseIntroMsgFragment = CourseIntroMsgFragment.newInstance("课程简介", CourseDetail.this);
CourseClassListFragment courseClassListFragment = CourseClassListFragment.newInstance("班级列表", CourseDetail.this);
CourseSelectedStuFragment courseSelectedStuFragment = CourseSelectedStuFragment.newInstance("选课学生", CourseDetail.this);
list.add(courseIntroMsgFragment);
list.add(courseClassListFragment);
list.add(courseSelectedStuFragment);
courseDetailUtil.initPage(list);
}
private void getCourseDetail(){
new Thread(new Runnable() {
@Override
public void run() {
long courseId = bundle.getLong(ModelFieldConstants.COURSE_ID);
long userId = bundle.getLong(ModelFieldConstants.USER_ID);
String urlParam = ModelFieldConstants.COURSE_ID + "=" + courseId + "&" +
ModelFieldConstants.USER_ID + "=" + userId;
String url = UrlConstants.COURSE_DETAIL + "?" + urlParam;
new GetUrlParamHttpUtils() {
@Override
public void nextMethod(BaseResponse<Object> baseResponse) {
//解析数据
Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
Object obj = baseResponse.getData();
LinkedTreeMap<String, String> courseDetailMap = null;
if(obj instanceof LinkedTreeMap){
courseDetailMap = (LinkedTreeMap<String, String>) obj;
}
//将LinkedTreeMap中字段映射到User类中
String jsonString = gson.toJson(courseDetailMap);
CourseDetailData courseDetail = gson.fromJson(jsonString, new TypeToken<CourseDetailData>() {}.getType());
System.out.println("courseDetail = " + courseDetail + "..................");
Message message = new Message();
message.obj = courseDetail;
message.arg1 = 200;
handler.sendMessage(message);
}
@Override
public void failedMethod(BaseResponse<Object> baseResponse) {
Message message = new Message();
message.obj = baseResponse.getMsg();
message.arg1 = baseResponse.getCode();
handler .sendMessage(message);
}
}.getConnect(url);
}
}).start();
}
}

@ -0,0 +1,170 @@
package com.example.stlink.activitys.fragmentChild.activityTeaHome;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import com.example.stlink.R;
import com.example.stlink.fragments.DidNotSignListFragment;
import com.example.stlink.fragments.LeaveListFragment;
import com.example.stlink.fragments.SignListFragment;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.model.constants.UrlConstants;
import com.example.stlink.model.response.BaseResponse;
import com.example.stlink.model.response.data.CourseSignMsg;
import com.example.stlink.utils.CommonUtils;
import com.example.stlink.utils.activityUtil.CheckCourseSignUtil;
import com.example.stlink.utils.httpUtils.GetUrlParamHttpUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.internal.LinkedTreeMap;
import java.util.ArrayList;
import java.util.List;
public class CheckCourseSign extends AppCompatActivity {
private ImageView abIvTitle;
private TextView aTvCourseName;
private TextView tvCourseNameMsg;
private TextView tvCourseTeaNameMsg;
private TextView tvCourseStuAmountMsg;
private TextView tvCourseStuArriveAmountMsg;
private TextView tvCourseStuLeaveAmountMsg;
private CheckCourseSignUtil checkCourseSignUtil;
private CourseSignMsg courseSignMsg;
private Bundle bundle;
private Handler handler;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tea_check_course_sign);
initView();
initPage();
}
private void initView(){
CommonUtils.changeStatusBar(CheckCourseSign.this);
abIvTitle = findViewById(R.id.ab_iv_title);
aTvCourseName = findViewById(R.id.ab_tv_course_name);
tvCourseNameMsg = findViewById(R.id.tv_course_name_msg);
tvCourseTeaNameMsg = findViewById(R.id.tv_course_tea_name_msg);
tvCourseStuAmountMsg = findViewById(R.id.tv_course_stu_amount_msg);
tvCourseStuArriveAmountMsg = findViewById(R.id.tv_course_stu_arrive_amount_msg);
tvCourseStuLeaveAmountMsg = findViewById(R.id.tv_course_stu_leave_amount_msg);
checkCourseSignUtil = new CheckCourseSignUtil(this.getWindow().getDecorView(),CheckCourseSign.this);
setClickListener();
refreshData();
handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
if(msg.arg1 == 200){
aTvCourseName.setText(courseSignMsg.getCourseName());
tvCourseStuAmountMsg.setText(String.valueOf(courseSignMsg.getCourseNum()));
}
return false;
}
});
getCourseSignMsg();
}
private void refreshData(){
bundle = getIntent().getExtras();
String courseName = bundle.getString(ModelFieldConstants.NOW_SIGN_COURSE_NAME);
if(!TextUtils.isEmpty(courseName)){
aTvCourseName.setText(courseName);
}
String teaName = bundle.getString(ModelFieldConstants.REAL_NAME);
if(!TextUtils.isEmpty(teaName)){
tvCourseTeaNameMsg.setText(teaName);
}
}
private void setClickListener(){
abIvTitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
/**
* viewpager2
*/
private void initPage(){
List<Fragment> list = new ArrayList<>();
SignListFragment signListFragment = SignListFragment.newInstance("已签到", this);
DidNotSignListFragment didNotSignListFragment = DidNotSignListFragment.newInstance("未签到", this);
LeaveListFragment leaveListFragment = LeaveListFragment.newInstance("请假列表", this);
list.add(signListFragment);
list.add(didNotSignListFragment);
list.add(leaveListFragment);
checkCourseSignUtil.initPage(list);
}
/**
*
*/
private void getCourseSignMsg(){
bundle = getIntent().getExtras();
Long courseId = bundle.getLong(ModelFieldConstants.NOW_SIGN_COURSE_ID);
Long userId = bundle.getLong(ModelFieldConstants.ID);
new Thread(new Runnable() {
final String urlParam = ModelFieldConstants.COURSE_ID + "=" + courseId + "&" +
ModelFieldConstants.USER_ID + "=" + userId;
final String url = UrlConstants.TEACHER_PAGE + "?" + urlParam;
@Override
public void run() {
new GetUrlParamHttpUtils() {
@Override
public void nextMethod(BaseResponse<Object> baseResponse) {
System.out.println("courseDataBaseResponse.getData() = " + baseResponse.getData() + "...............");
//解析数据
Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
Object obj = baseResponse.getData();
LinkedTreeMap<String, String> courseDataMap = null;
if(obj instanceof LinkedTreeMap){
courseDataMap = (LinkedTreeMap<String, String>) obj;
}
//将LinkedTreeMap中字段映射到CourseData类中
courseSignMsg = new CourseSignMsg();
String jsonString = gson.toJson(courseDataMap);
courseSignMsg = gson.fromJson(jsonString, CourseSignMsg.class);
System.out.println("CheckCourseSign:courseData = " + courseSignMsg);
Message message = new Message();
message.arg1 = 200;
handler.sendMessage(message);
}
@Override
public void failedMethod(BaseResponse<Object> baseResponse) { }
}.getConnect(url);
}
}).start();
}
}

@ -0,0 +1,162 @@
package com.example.stlink.activitys.fragmentChild.activityTeaHome;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.stlink.R;
import com.example.stlink.configs.adapter.CourseChooseAdapter;
import com.example.stlink.configs.onRecyclerViewItemClickListener;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.model.constants.UrlConstants;
import com.example.stlink.model.domain.Course;
import com.example.stlink.model.response.BaseResponse;
import com.example.stlink.model.response.data.CourseData;
import com.example.stlink.utils.httpUtils.GetUrlParamHttpUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.internal.LinkedTreeMap;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
import java.util.List;
public class ChooseCourse extends AppCompatActivity {
private ImageView abIvTitle;
private RecyclerView rvCourseList;
private List<Course> coursesData;
private CourseChooseAdapter adapter;
private static Handler handler;
private static Bundle bundle;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_choose_course);
initView();
}
private void initView(){
abIvTitle = findViewById(R.id.ab_iv_title);
rvCourseList = findViewById(R.id.rv_course_list);
coursesData = new ArrayList<>();
adapter = new CourseChooseAdapter(
ChooseCourse.this,
R.layout.card_course_name_list,
coursesData
);
LinearLayoutManager llm = new LinearLayoutManager(ChooseCourse.this);
rvCourseList.setLayoutManager(llm);
rvCourseList.setAdapter(adapter);
bundle = getIntent().getExtras();
handler = new Handler(Looper.getMainLooper()){
@SuppressLint("NotifyDataSetChanged")
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
CourseData courseData = (CourseData) msg.obj;
coursesData.addAll(courseData.getRecords());
adapter.notifyDataSetChanged();
System.out.println("size == " + adapter.getItemCount() + "................................");
}
};
getUnfinishedCourseList();
initPage();
}
private void initPage(){
abIvTitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
adapter.setOnItemClickListener(new onRecyclerViewItemClickListener() {
@Override
public void onItemClick(RecyclerView parent, View view, int position) {
bundle = getIntent().getExtras();
int chooseCourseSelect = bundle.getInt(ModelFieldConstants.COURSE_CHOOSE_SELECT);
Course course = coursesData.get(position);
String courseName = course.getmCourseName();
Long courseId = course.getmCourseId();
bundle.putString(ModelFieldConstants.COURSE_NAME, courseName);
bundle.putLong(ModelFieldConstants.COURSE_ID, courseId);
if(chooseCourseSelect == 0){
Intent intent = new Intent();
intent.putExtras(bundle);
setResult(200,intent);
finish();
}else if (chooseCourseSelect == 1){
bundle.putLong(ModelFieldConstants.NOW_SIGN_COURSE_ID, courseId);
bundle.putString(ModelFieldConstants.NOW_SIGN_COURSE_NAME, courseName);
Intent intent = new Intent(ChooseCourse.this, CheckCourseSign.class);
intent.putExtras(bundle);
startActivity(intent);
}
}
@Override
public void onItemLongClick(RecyclerView parent, View view, int position) { }
});
}
private static void getUnfinishedCourseList(){
new Thread(new Runnable() {
final String urlParam = ModelFieldConstants.USER_ID + "=" + bundle.getLong(ModelFieldConstants.ID);
final String url = UrlConstants.TEACHER_UNFINISHED + "?" + urlParam;
@Override
public void run() {
new GetUrlParamHttpUtils() {
@Override
public void nextMethod(BaseResponse<Object> baseResponse) {
System.out.println("courseDataBaseResponse.getData() = " + baseResponse.getData() + "...............");
//解析数据
Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
Object obj = baseResponse.getData();
LinkedTreeMap<String, String> courseDataMap = null;
if(obj instanceof LinkedTreeMap){
courseDataMap = (LinkedTreeMap<String, String>) obj;
}
//将LinkedTreeMap中字段映射到CourseData类中
String jsonString = gson.toJson(courseDataMap);
CourseData<Course> courseData = gson.fromJson(jsonString, new TypeToken<CourseData<Course>>() {}.getType());
System.out.println("courseData = " + courseData);
if(courseData != null){
Message message = new Message();
message.obj = courseData;
handler.sendMessage(message);
}else{
System.out.println("courseData: null " + "...............................");
}
}
@Override
public void failedMethod(BaseResponse<Object> baseResponse) {
}
}.getConnect(url);
}
}).start();
}
}

@ -0,0 +1,370 @@
package com.example.stlink.activitys.fragmentChild.activityTeaHome;
import android.annotation.SuppressLint;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.bumptech.glide.Glide;
import com.donkingliang.imageselector.utils.ImageSelector;
import com.example.stlink.R;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.model.constants.UrlConstants;
import com.example.stlink.model.request.CourseCreateRequest;
import com.example.stlink.utils.CommonUtils;
import com.example.stlink.utils.activityUtil.CreateCourseUtil;
import com.example.stlink.utils.activityUtil.ImgUploadUtil;
import com.google.android.material.datepicker.MaterialDatePicker;
import com.google.android.material.datepicker.MaterialPickerOnPositiveButtonClickListener;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.textfield.TextInputEditText;
import java.util.ArrayList;
import java.util.Objects;
public class CreateCourse extends AppCompatActivity {
private ImageView abIvTitle;
private TextInputEditText etCourseName;
private ImageView ivAddImg;
private TextInputEditText etCourseDescription;
private TextInputEditText etStartTime;
private TextInputEditText etEndTime;
private TextInputEditText etCreateTime;
private TextInputEditText etStatus;
private Button btCreateCourse;
private boolean isSuccessCoursePhoto;
private boolean isSuccessCourseStartTime;
private boolean isSuccessCourseEndTime;
private boolean isSuccessCourseCreateTime;
private MaterialDatePicker<Long> startDatePicker;
private MaterialDatePicker<Long> endDatePicker;
private Bundle bundle;
private Handler btAddHandler;
//每两秒进行一个检测
private final Runnable btRunnable = new Runnable() {
@SuppressLint("ResourceAsColor")
@Override
public void run() {
//如果所有信息都已经添加成功之后,才启用按钮,=
if(isSuccessCoursePhoto && isSuccessCourseStartTime && isSuccessCourseEndTime && isSuccessCourseCreateTime){
System.out.println("Here...............................1");
String courseName = Objects.requireNonNull(etCourseName.getText()).toString();
String courseIntroduce = Objects.requireNonNull(etCourseDescription.getText()).toString();
Bundle bundle1 = getIntent().getExtras();
bundle1.putString(ModelFieldConstants.COURSE_NAME, courseName);
bundle1.putString(ModelFieldConstants.INTRODUCE, courseIntroduce);
getIntent().putExtras(bundle1);
//课程名和课程简介不能为空
if(!TextUtils.isEmpty(courseName) && !TextUtils.isEmpty(courseIntroduce)){
System.out.println("Here...............................2");
Bundle bundle2 = getIntent().getExtras();
long startTime = bundle2.getLong(ModelFieldConstants.START_TIME);
long endTime = bundle2.getLong(ModelFieldConstants.END_TIME);
System.out.println("startTime == " + startTime + "..........................");
System.out.println("endTime == " + endTime + "...........................");
//结束时间要在开始时间之后
String courseStatus = Objects.requireNonNull(etStatus.getText()).toString();
boolean isFinished = "已结课".equals(courseStatus);
if((!isFinished && (startTime < endTime)) || (isFinished && (startTime >= endTime))){
System.out.println("Here...............................3");
//启用按钮
btCreateCourse.setEnabled(true);
//更改按钮样式
btCreateCourse.setBackgroundResource(R.drawable.selector_bottom_add_course);
btCreateCourse.setTextColor(Color.WHITE);
//按钮事件
btCreateCourse.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("createCourse.............");
Handler handler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if ("success".equals(msg.obj)){
System.out.println("添加成功...........");
Toast.makeText(CreateCourse.this, "创建成功", Toast.LENGTH_SHORT).show();
btAddHandler.removeCallbacks(btRunnable);
finish();
}
}
};
CreateCourseUtil.createCourse(CreateCourse.this, getCourseRequest(), handler, UrlConstants.TEACHER_COURSE);
}
});
}else {
//禁用按钮
btCreateCourse.setEnabled(false);
}
}else {
//禁用按钮
btCreateCourse.setEnabled(false);
}
}else{
//禁用按钮
btCreateCourse.setEnabled(false);
}
btAddHandler.postDelayed(this, 2000);
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tea_create_course);
initView();
btAddHandler.postDelayed(btRunnable, 2000);
}
//用于图片选择器选择图片之后的回调,来完成图片上传和刷新本地
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 100 && data != null) {
//获取选择器返回的数据
ArrayList<String> images = data.getStringArrayListExtra(
ImageSelector.SELECT_RESULT);
String url = images.get(0);
Handler handler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
bundle = (Bundle) msg.obj;
if(bundle.getBoolean(UrlConstants.IS_IMG_UPLOAD_SUCCESS)){
System.out.println("refreshData..................");
getIntent().putExtras(bundle);
refreshData();
//表示照片添加成功
isSuccessCoursePhoto = true;
}else{
Toast.makeText(CreateCourse.this, "修改失败", Toast.LENGTH_SHORT).show();
}
}
};
ImgUploadUtil.userImgUpload(bundle, handler, url, ModelFieldConstants.COURSE_PHOTO);
/**
*
* true
* true
*/
boolean isCameraImage = data.getBooleanExtra(ImageSelector.IS_CAMERA_IMAGE, false);
}
}
/**
*
*/
private void initView(){
CommonUtils.changeStatusBar(this);
btAddHandler = new Handler();
isSuccessCoursePhoto = false;
isSuccessCourseStartTime = false;
isSuccessCourseEndTime = false;
isSuccessCourseCreateTime = false;
abIvTitle = findViewById(R.id.ab_iv_title);
etCourseName = findViewById(R.id.et_course_name);
ivAddImg = findViewById(R.id.iv_add_img);
etCourseDescription = findViewById(R.id.et_course_description);
etStartTime = findViewById(R.id.et_start_time);
etEndTime = findViewById(R.id.et_end_time);
etCreateTime = findViewById(R.id.et_create_time);
etStatus = findViewById(R.id.et_status);
btCreateCourse = findViewById(R.id.bt_create_course);
startDatePicker = MaterialDatePicker.Builder.datePicker()
.setTitleText("SELECT DATE")
.setSelection(MaterialDatePicker.todayInUtcMilliseconds())
.build();
endDatePicker = MaterialDatePicker.Builder.datePicker()
.setTitleText("SELECT DATE")
.setSelection(MaterialDatePicker.todayInUtcMilliseconds())
.build();
btCreateCourse.setEnabled(false);
refreshData();
setClickListener();
}
private void refreshData(){
bundle = getIntent().getExtras();
String courseImg = bundle.getString(ModelFieldConstants.COURSE_PHOTO);
if(courseImg != null){
Glide.with(getApplicationContext())
.load(courseImg)
.into(ivAddImg);
}
//不可粘贴,长按不会弹出粘贴框
etStartTime.setKeyListener(null);
etEndTime.setKeyListener(null);
etCreateTime.setKeyListener(null);
etStatus.setKeyListener(null);
}
/**
*
*/
private void setClickListener(){
startDatePicker.addOnPositiveButtonClickListener(new MaterialPickerOnPositiveButtonClickListener<Long>() {
@Override
public void onPositiveButtonClick(Long selection) {
String startFormDate = CommonUtils.stampToDate(String.valueOf(selection), "yyyy年MM月dd日");
etStartTime.setText(startFormDate);
isSuccessCourseStartTime = true;
Bundle bundle1 = getIntent().getExtras();
bundle1.putLong(ModelFieldConstants.START_TIME, selection);
getIntent().putExtras(bundle1);
}
});
endDatePicker.addOnPositiveButtonClickListener(new MaterialPickerOnPositiveButtonClickListener<Long>() {
@Override
public void onPositiveButtonClick(Long selection) {
String endFormDate = CommonUtils.stampToDate(String.valueOf(selection), "yyyy年MM月dd日");
etEndTime.setText(endFormDate);
isSuccessCourseEndTime = true;
Bundle bundle1 = getIntent().getExtras();
bundle1.putLong(ModelFieldConstants.END_TIME, selection);
getIntent().putExtras(bundle1);
}
});
//点击添加图片
ivAddImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//调用第三方开源库,单选并剪裁
ImageSelector.builder()
.useCamera(false) // 设置是否使用拍照
.setCrop(true) // 设置是否使用图片剪切功能。
.setCropRatio(1.0f) // 图片剪切的宽高比,默认1.0f。宽固定为手机屏幕的宽。
.setSingle(true) //设置是否单选
.canPreview(true) //是否可以预览图片默认为true
.start(CreateCourse.this, 100); // 打开相册
}
});
//课程开始时间
etStartTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!startDatePicker.isAdded()){
startDatePicker.show(getSupportFragmentManager(), "Hello");
}
}
});
//课程结束时间
etEndTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!endDatePicker.isAdded()){
endDatePicker.show(getSupportFragmentManager(), "Hello");
}
}
});
//刷新当前时间
etCreateTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
long currentDate = System.currentTimeMillis();
String curFormDate = CommonUtils.stampToDate(String.valueOf(currentDate), "yyyy年MM月dd日");
etCreateTime.setText(curFormDate);
isSuccessCourseCreateTime = true;
}
});
//课程状态选择
etStatus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String[] singleItems = {"未结课", "已结课"};
int checkedItem = "未结课".equals(etStatus.getText().toString()) ? 0 : 1;
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(CreateCourse.this)
.setTitle("请选择课程授课状态")
.setNeutralButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
etStatus.setText(singleItems[bundle.getInt("checkedItem")]);
}
})
.setSingleChoiceItems(singleItems, checkedItem, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
bundle.putInt("checkedItem", which);
}
});
materialAlertDialogBuilder.show();
}
});
//返回上一个活动
abIvTitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
/**
* courseRequest
* @return courseRequest
*/
private CourseCreateRequest getCourseRequest(){
CourseCreateRequest courseCreateRequest = new CourseCreateRequest();
bundle = getIntent().getExtras();
String collegeName = bundle.getString(ModelFieldConstants.COLLEGE_NAME);
String courseName = bundle.getString(ModelFieldConstants.COURSE_NAME);
String coursePhoto = bundle.getString(ModelFieldConstants.COURSE_PHOTO);
Long endTime = bundle.getLong(ModelFieldConstants.END_TIME);
String introduce = bundle.getString(ModelFieldConstants.INTRODUCE);
String realName = bundle.getString(ModelFieldConstants.REAL_NAME);
Long startTime = bundle.getLong(ModelFieldConstants.START_TIME);
Long userId = bundle.getLong(ModelFieldConstants.ID);
String username = bundle.getString(ModelFieldConstants.USER_NAME);
courseCreateRequest.setCollegeName(collegeName);
courseCreateRequest.setCourseName(courseName);
courseCreateRequest.setCoursePhoto(coursePhoto);
courseCreateRequest.setEndTime(endTime);
courseCreateRequest.setIntroduce(introduce);
courseCreateRequest.setRealName(realName);
courseCreateRequest.setStartTime(startTime);
courseCreateRequest.setUserId(userId);
courseCreateRequest.setUserName(username);
return courseCreateRequest;
}
}

@ -0,0 +1,368 @@
package com.example.stlink.activitys.fragmentChild.activityTeaHome;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatButton;
import com.alibaba.fastjson.JSON;
import com.example.stlink.R;
import com.example.stlink.activitys.MapActivity;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.model.constants.UrlConstants;
import com.example.stlink.model.request.CourseCreateSignRequest;
import com.example.stlink.model.response.BaseResponse;
import com.example.stlink.utils.CommonUtils;
import com.example.stlink.utils.QRCodeUtil;
import com.example.stlink.utils.httpUtils.PostBodyParamHttpUtils;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.timepicker.MaterialTimePicker;
import com.google.android.material.timepicker.TimeFormat;
import java.text.ParseException;
import java.util.Objects;
public class CreateSign extends AppCompatActivity {
private ImageView abIvTitle;
private TextView tvCourseName;
private TextInputEditText etStuAmount;
private TextInputEditText etStartTime;
private TextInputEditText etEndTime;
private TextInputEditText etLocation;
private TextInputEditText etCode;
private ImageView ivAddImg;
private AppCompatButton abBtSave;
private int currYear;
private int currMonth;
private int currDay;
private int currHour;
private int currMin;
private int currSecond;
private Long startTimeStamp;
private Long endTimeStamp;
private String courseName;
private boolean hasChooseStartTime;
private boolean hasChooseEndTime;
private MaterialTimePicker startTimePicker;
private MaterialTimePicker endTimePicker;
private Bundle bundle;
private Handler handler;
private static ActivityResultLauncher<Intent> intentActivityResultLauncher;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tea_create_sign);
initView();
}
/**
*
*/
private void initView(){
CommonUtils.changeStatusBar(CreateSign.this);
hasChooseStartTime = false;
hasChooseEndTime = false;
abIvTitle = findViewById(R.id.ab_iv_title);
tvCourseName = findViewById(R.id.tv_course_name);
etStuAmount = findViewById(R.id.et_stu_amount);
etStartTime = findViewById(R.id.et_start_time);
etEndTime = findViewById(R.id.et_end_time);
etLocation = findViewById(R.id.et_location);
etCode = findViewById(R.id.et_code);
ivAddImg = findViewById(R.id.iv_add_img);
abBtSave = findViewById(R.id.ab_bt_save);
//禁止输入
etStartTime.setKeyListener(null);
etEndTime.setKeyListener(null);
etLocation.setKeyListener(null);
bundle = getIntent().getExtras();
courseName = bundle.getString(ModelFieldConstants.COURSE_NAME);
if(!TextUtils.isEmpty(courseName)){
tvCourseName.setText(courseName);
}
Long curTimeStamp = System.currentTimeMillis();
String currTime = CommonUtils.stampToDate(String.valueOf(curTimeStamp), "yyyy-MM-dd-hh-mm-ss");
String[] timeStrs = currTime.split("-");
currYear = Integer.parseInt(timeStrs[0]);
currMonth = Integer.parseInt(timeStrs[1]);
currDay = Integer.parseInt(timeStrs[2]);
currHour = Integer.parseInt(timeStrs[3]);
currMin = Integer.parseInt(timeStrs[4]);
currSecond = Integer.parseInt(timeStrs[5]);
startTimePicker = new MaterialTimePicker.Builder()
.setTimeFormat(TimeFormat.CLOCK_12H)
.setHour(currHour)
.setMinute(currMin)
.setTitleText("开始时间选择")
.setPositiveButtonText("确认")
.setNegativeButtonText("取消")
.build();
endTimePicker = new MaterialTimePicker.Builder()
.setTimeFormat(TimeFormat.CLOCK_12H)
.setHour(currHour)
.setMinute(currMin)
.setTitleText("结束时间选择")
.setPositiveButtonText("确认")
.setNegativeButtonText("取消")
.build();
intentActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
Intent data = result.getData();
int resultCode = result.getResultCode();
System.out.println("registerForActivityResult...........................");
if (resultCode == 100) {
assert data != null;
getIntent().putExtras(data.getExtras());
String latLon = getIntent().getExtras().getString(ModelFieldConstants.LOCATION);
if(!TextUtils.isEmpty(latLon)){
etLocation.setText(latLon);
}
}else if(resultCode == 200){
assert data != null;
getIntent().putExtras(data.getExtras());
bundle = getIntent().getExtras();
courseName = bundle.getString(ModelFieldConstants.COURSE_NAME);
if(courseName != null){
tvCourseName.setText(courseName);
}
}
});
setClickListener();
}
/**
*
*/
private void setClickListener(){
tvCourseName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(CreateSign.this, ChooseCourse.class);
intent.putExtras(getIntent().getExtras());
intentActivityResultLauncher.launch(intent);
}
});
abIvTitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
//点击添加图片
ivAddImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String signCode = Objects.requireNonNull(etCode.getText()).toString();
if (TextUtils.isEmpty(signCode)){
Toast.makeText(CreateSign.this, "请先输入签到码", Toast.LENGTH_SHORT).show();
}else{
Bitmap codeBitmap = QRCodeUtil.createQRCode(signCode,500,500,null);
ivAddImg.setImageBitmap(codeBitmap);
}
}
});
//设置回调方法,进行获取选择的时间,并将其刷新到界面
startTimePicker.addOnPositiveButtonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int startHour = startTimePicker.getHour();
int startMin = startTimePicker.getMinute();
String startTime = String.valueOf(currYear) + "-" +
String.valueOf(currMonth) + "-" +
String.valueOf(currDay) + " " +
String.valueOf(startHour) + ":" +
String.valueOf(startMin) + ":" + "00";
try {
startTimeStamp = Long.parseLong(CommonUtils.dateToStamp(startTime, "yyyy-MM-dd hh:mm:ss"));
} catch (ParseException e) {
e.printStackTrace();
}
etStartTime.setText(startTime);
hasChooseStartTime = true;
}
});
endTimePicker.addOnPositiveButtonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int endHour = endTimePicker.getHour();
int endMin = endTimePicker.getMinute();
String endTime = String.valueOf(currYear) + "-" +
String.valueOf(currMonth) + "-" +
String.valueOf(currDay) + " " +
String.valueOf(endHour) + ":" +
String.valueOf(endMin) + ":" + "00";
try {
endTimeStamp = Long.parseLong(CommonUtils.dateToStamp(endTime, "yyyy-MM-dd hh:mm:ss"));
} catch (ParseException e) {
e.printStackTrace();
}
etEndTime.setText(endTime);
hasChooseEndTime = true;
}
});
//课程开始时间
etStartTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!startTimePicker.isAdded()){
startTimePicker.show(getSupportFragmentManager(), "Hello");
}
}
});
//课程结束时间
etEndTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!endTimePicker.isAdded()){
endTimePicker.show(getSupportFragmentManager(), "Hello");
}
}
});
//定位
etLocation.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(CreateSign.this, MapActivity.class);
intent.putExtras(getIntent().getExtras());
intentActivityResultLauncher.launch(intent);
// etLocation.setText("定位");
}
});
//保存按钮
abBtSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bundle = getIntent().getExtras();
String courseName = bundle.getString(ModelFieldConstants.COURSE_NAME);
String stuAmountStr = Objects.requireNonNull(etStuAmount.getText()).toString();
String location = Objects.requireNonNull(etLocation.getText()).toString();
String signCodeStr = Objects.requireNonNull(etCode.getText()).toString();
Long courseId = bundle.getLong(ModelFieldConstants.COURSE_ID);
Long userId = bundle.getLong(ModelFieldConstants.ID);
if(!TextUtils.isEmpty(courseName)){
if(!TextUtils.isEmpty(stuAmountStr)){
if(hasChooseStartTime && hasChooseEndTime){
if(startTimeStamp <= endTimeStamp){
if(!TextUtils.isEmpty(location)){
if(!TextUtils.isEmpty(signCodeStr)){
try{
Long stuAmount = Long.parseLong(stuAmountStr);
try{
Long signCode = Long.parseLong(signCodeStr);
CourseCreateSignRequest courseCreateSignRequest = new CourseCreateSignRequest();
courseCreateSignRequest.setCourseName(courseName);
courseCreateSignRequest.setTotal(stuAmount);
courseCreateSignRequest.setBeginTime(startTimeStamp);
courseCreateSignRequest.setEndTime(endTimeStamp);
courseCreateSignRequest.setCourseAddr(location);
courseCreateSignRequest.setCourseId(courseId);
courseCreateSignRequest.setUserId(userId);
courseCreateSignRequest.setSignCode(signCode);
handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
if(msg.arg1 == 200){
String error = (String) msg.obj;
Toast.makeText(CreateSign.this, error, Toast.LENGTH_SHORT).show();
}else if(msg.arg1 == 100){
Toast.makeText(CreateSign.this, "创建签到成功", Toast.LENGTH_SHORT).show();
//创建成功后直接结束当前活动,并且跳到查看签到状态
Intent intent = new Intent();
bundle = getIntent().getExtras();
bundle.putLong(ModelFieldConstants.NOW_SIGN_COURSE_ID, courseId);
bundle.putString(ModelFieldConstants.NOW_SIGN_COURSE_NAME, courseName);
intent.putExtras(bundle);
setResult(100,intent);
finish();
}
return false;
}
});
createSign(courseCreateSignRequest);
}catch (NumberFormatException numberFormatException){
Toast.makeText(CreateSign.this, "请输入数字作为签到码", Toast.LENGTH_SHORT).show();
}
}catch (NumberFormatException numberFormatException){
Toast.makeText(CreateSign.this, "请输入正确的签到人数", Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(CreateSign.this, "请先输入签到口令", Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(CreateSign.this, "请先选择签到地点", Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(CreateSign.this, "时间设置错误", Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(CreateSign.this, "请先选择开始结束时间", Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(CreateSign.this, "请先输入待签到人数", Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(CreateSign.this, "请先选择课程", Toast.LENGTH_SHORT).show();
}
}
});
}
private void createSign(CourseCreateSignRequest courseCreateSignRequest){
new Thread(new Runnable() {
@Override
public void run() {
System.out.println( "courseCreateSignRequest : " + courseCreateSignRequest.toString() + "..............................");
String json = JSON.toJSONString(courseCreateSignRequest);
String url = UrlConstants.TEACHER_INITIATE;
new PostBodyParamHttpUtils() {
@Override
public void nextMethod(BaseResponse<Object> baseResponse) {
Message message = new Message();
message.arg1 = 100;
handler.sendMessage(message);
}
@Override
public void failedMethod(BaseResponse<Object> baseResponse) {
Message message = new Message();
message.arg1 = 200;
message.obj = baseResponse.getMsg();
handler.sendMessage(message);
}
}.postConnect(url, json);
}
}).start();
}
}

@ -0,0 +1,402 @@
package com.example.stlink.activitys.fragmentChild.activityUserInfo;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatButton;
import com.example.stlink.R;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.model.constants.UrlConstants;
import com.example.stlink.model.response.BaseResponse;
import com.example.stlink.utils.httpUtils.PostBodyParamHttpUtils;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.textfield.TextInputEditText;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Objects;
public class ModifyUserInfo extends AppCompatActivity {
private TextView abTvTitle;
private ImageView abIvTitle;
private AppCompatButton abBtSave;
private TextInputEditText tiNewMsg;
private Handler handler;
private Bundle bundle;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_modify_user_info);
initView();
}
/**
*
*/
private void initView(){
abTvTitle = findViewById(R.id.ab_tv_title);
abIvTitle = findViewById(R.id.ab_iv_title);
abBtSave = findViewById(R.id.ab_bt_save);
tiNewMsg = findViewById(R.id.ti_new_msg);
refreshData();
//设置监听器
setListener();
}
/**
*
*/
private void refreshData(){
bundle = getIntent().getExtras();
String toBeModify = (String) bundle.get(ModelFieldConstants.TO_BE_MODIFY);
switch (toBeModify){
case ModelFieldConstants.USER_NAME : {
abTvTitle.setText("更换昵称");
String userName = (String) bundle.get(ModelFieldConstants.USER_NAME);
if(userName != null){
tiNewMsg.setText(userName);
}else{
tiNewMsg.setText("");
}
tiNewMsg.setSelection(tiNewMsg.getText().length());
break;
}
case ModelFieldConstants.COLLEGE_NAME : {
abTvTitle.setText("更换大学");
String schoolName = (String) bundle.get(ModelFieldConstants.COLLEGE_NAME);
if(schoolName != null){
tiNewMsg.setText(schoolName);
}else{
tiNewMsg.setText("");
}
tiNewMsg.setSelection(tiNewMsg.getText().length());
break;
}
case ModelFieldConstants.REAL_NAME : {
abTvTitle.setText("真实姓名验证");
String realName = (String) bundle.get(ModelFieldConstants.REAL_NAME);
if(realName != null){
tiNewMsg.setText(realName);
}else{
tiNewMsg.setText("");
}
tiNewMsg.setSelection(tiNewMsg.getText().length());
break;
}
case ModelFieldConstants.ID_NUMBER : {
if ((bundle.getInt(ModelFieldConstants.ROLE_ID) == 0)) {
abTvTitle.setText("更换学号");
} else {
abTvTitle.setText("更换工号");
}
Long idNumber = (Long) bundle.get(ModelFieldConstants.ID_NUMBER);
if(idNumber != null){
tiNewMsg.setText(String.valueOf(idNumber));
}else{
tiNewMsg.setText("");
}
tiNewMsg.setSelection(tiNewMsg.getText().length());
break;
}
case ModelFieldConstants.GENDER : {
//修改性别的时候,不能单纯的输入了,无法保证用户的输入内容,所以采用对话框的形式
abTvTitle.setText("更换性别");
Boolean sex = (Boolean) bundle.get(ModelFieldConstants.GENDER);
if(sex != null){
if(sex){
tiNewMsg.setText("男");
}else{
tiNewMsg.setText("女");
}
}
//禁止编辑
tiNewMsg.setFocusableInTouchMode(false);
//不可粘贴,长按不会弹出粘贴框
tiNewMsg.setKeyListener(null);
tiNewMsg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("choose gender............");
String[] singleItems = {"男", "女"};
int checkedItem = "男".equals(tiNewMsg.getText().toString()) ? 0 : 1;
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ModifyUserInfo.this)
.setTitle("请选择性别")
.setNeutralButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
tiNewMsg.setText(singleItems[bundle.getInt("checkedItem")]);
}
})
.setSingleChoiceItems(singleItems, checkedItem, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
bundle.putInt("checkedItem", which);
}
});
materialAlertDialogBuilder.show();
}
});
break;
}
case ModelFieldConstants.EMAIL : {
abTvTitle.setText("更换邮箱");
String email = (String) bundle.get(ModelFieldConstants.EMAIL);
if(email != null){
tiNewMsg.setText(email);
}else{
tiNewMsg.setText("");
}
tiNewMsg.setSelection(tiNewMsg.getText().length());
break;
}
case ModelFieldConstants.PHONE : {
abTvTitle.setText("更换电话号码");
String phone = (String) bundle.get(ModelFieldConstants.PHONE);
if(phone != null){
tiNewMsg.setText(phone);
}else{
tiNewMsg.setText("");
}
tiNewMsg.setSelection(tiNewMsg.getText().length());
break;
}
default:{
tiNewMsg.setText("error.....");
}
}
}
/**
*
*/
private void setListener(){
//返回上一个活动,也就是个人信息部分
abIvTitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
tiNewMsg.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
//当输入框文本发生修改时,启动保存按钮,并且为按钮绑定点击监听事件
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//启用保存按钮
abBtSave.setEnabled(true);
//修改按钮样式选择器
abBtSave.setBackgroundResource(R.drawable.selector_bottom_modify_info_save_2);
abBtSave.setTextColor(Color.WHITE);
//为按钮添加点击事件
abBtSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog();
}
});
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
/**
*
*/
private void dialog(){
AlertDialog alertDialog2 = new AlertDialog.Builder(this)
.setMessage("请确认是否进行" + abTvTitle.getText())
.setPositiveButton("确定", new DialogInterface.OnClickListener() {//添加"Yes"按钮
@Override
public void onClick(DialogInterface dialogInterface, int i) {
modifyInfo();
handler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Toast.makeText(ModifyUserInfo.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();
}
};
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {//添加取消
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
})
.create();
alertDialog2.show();
}
/**
*
*/
private void modifyInfo(){
new Thread(new Runnable() {
@Override
public void run() {
JSONObject jsonObject = new JSONObject();
Boolean isLegalInput = false;
try {
jsonObject.put(ModelFieldConstants.ID, (Long) bundle.get(ModelFieldConstants.ID));
} catch (JSONException e) {
e.printStackTrace();
}
//根据上一个活动传递过来的选择字段,来选择对应的传输方法
String modifyField = (String) bundle.get(ModelFieldConstants.TO_BE_MODIFY);
switch (modifyField){
case ModelFieldConstants.ID_NUMBER:
case ModelFieldConstants.IN_SCHOOL_TIME:{
try {
Long msg = Long.parseLong(Objects.requireNonNull(tiNewMsg.getText()).toString());
jsonObject.put(modifyField, msg);
bundle.putLong(modifyField, msg);
isLegalInput = true;
}catch (NumberFormatException e){
e.printStackTrace();
Message msg = new Message();
msg.obj = "输入非法.";
handler.sendMessage(msg);
}catch (JSONException e) {
e.printStackTrace();
}
break;
}
case ModelFieldConstants.GENDER:{
try {
String msg = Objects.requireNonNull(tiNewMsg.getText()).toString();
if("男".equals(msg) || "女".equals(msg)){
Boolean msgBoolean = "男".equals(msg);
jsonObject.put(modifyField, msgBoolean);
bundle.putBoolean(modifyField, msgBoolean);
isLegalInput = true;
}
} catch (JSONException e) {
e.printStackTrace();
}
break;
}
case ModelFieldConstants.PHONE: {
try {
String msg = Objects.requireNonNull(tiNewMsg.getText()).toString();
//判断输入电话号码是否能解析为long型能解析的话说明输入没有非法字符
Long msgLong = Long.parseLong(msg);
jsonObject.put(modifyField, msg);
bundle.putString(modifyField, msg);
isLegalInput = true;
}catch (NumberFormatException e){
e.printStackTrace();
Message msg = new Message();
msg.obj = "输入非法.";
handler.sendMessage(msg);
}catch (JSONException e) {
e.printStackTrace();
}
break;
}
case ModelFieldConstants.EMAIL:{
Message message = new Message();
try {
String msg = Objects.requireNonNull(tiNewMsg.getText()).toString();
String[] msgStr = msg.split("@");
//必须得包含@符号
if(msgStr.length == 2){
//邮箱的两部分必定是长度大于0的
if(msgStr[0].length() > 0 && msgStr[1].length() > 0){
jsonObject.put(modifyField, msg);
bundle.putString(modifyField, msg);
isLegalInput = true;
}else{
message.obj = "输入非法.";
handler.sendMessage(message);
}
}else{
message.obj = "输入非法.";
handler.sendMessage(message);
}
} catch (NumberFormatException e){
e.printStackTrace();
message.obj = "输入非法.";
handler.sendMessage(message);
}catch (JSONException e) {
e.printStackTrace();
}
break;
}
default:{
try {
String msg = Objects.requireNonNull(tiNewMsg.getText()).toString();
jsonObject.put(modifyField, msg);
bundle.putString(modifyField, msg);
isLegalInput = true;
} catch (JSONException e) {
e.printStackTrace();
}
}
}
System.out.println( "jsonObject : " + jsonObject.toString() + "..............................");
String json = jsonObject.toString();
String url = UrlConstants.USER_UPDATE;
if(isLegalInput){
new PostBodyParamHttpUtils() {
@Override
public void nextMethod(BaseResponse<Object> baseResponse) {
Intent intent = new Intent();
intent.putExtras(bundle);
setResult(RESULT_OK,intent);
finish();
}
@Override
public void failedMethod(BaseResponse<Object> baseResponse) {
Message message = new Message();
System.out.println("修改失败.......................");
handler.sendMessage(message);
}
}.postConnect(url, json);
}
}
}).start();
}
}

@ -0,0 +1,18 @@
package com.example.stlink.activitys.fragmentChild.activityUserInfo;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.example.stlink.R;
import com.example.stlink.utils.CommonUtils;
public class UserInfoAbout extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_detail_about);
CommonUtils.changeStatusBar(this);
}
}

@ -0,0 +1,320 @@
package com.example.stlink.activitys.fragmentChild.activityUserInfo;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import com.donkingliang.imageselector.utils.ImageSelector;
import com.example.stlink.R;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.model.constants.UrlConstants;
import com.example.stlink.utils.CommonUtils;
import com.example.stlink.utils.activityUtil.ImgUploadUtil;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
public class UserInfoDetail extends AppCompatActivity {
private ConstraintLayout clHeadImg;
private ConstraintLayout clUserName;
private ConstraintLayout clSchoolName;
private ConstraintLayout clRealName;
private ConstraintLayout clIdNumber;
private ConstraintLayout clSex;
private ConstraintLayout clCreateTime;
private ConstraintLayout clEmail;
private ConstraintLayout clPhone;
private ImageView ivHeadImg;
private TextView tvUserNameMsg;
private TextView tvSchoolMsg;
private TextView tvRealNameMsg;
private TextView tvIdNumberMsg;
private TextView tvSexMsg;
private TextView tvCreateTimeMsg;
private TextView tvEmailMsg;
private TextView tvPhoneMsg;
private TextView tvIdNumber;
private ImageView abIvTitle;
private Bundle bundle;
private ActivityResultLauncher<Intent> intentActivityResultLauncher;
private ArrayList<String> arrayList;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_detail_my_info);
CommonUtils.changeStatusBar(this);
initView();
}
/**
*
*/
public void initView(){
clHeadImg = findViewById(R.id.cl_head_img);
clUserName = findViewById(R.id.cl_user_name);
clSchoolName = findViewById(R.id.cl_school_name);
clRealName = findViewById(R.id.cl_real_name);
clIdNumber = findViewById(R.id.cl_id_number);
clSex = findViewById(R.id.cl_sex);
clCreateTime = findViewById(R.id.cl_create_time);
clEmail = findViewById(R.id.cl_email);
clPhone = findViewById(R.id.cl_phone);
ivHeadImg = findViewById(R.id.iv_head_img);
tvUserNameMsg = findViewById(R.id.tv_user_name_msg);
tvSchoolMsg = findViewById(R.id.tv_school_msg);
tvRealNameMsg = findViewById(R.id.tv_real_name_msg);
tvIdNumberMsg = findViewById(R.id.tv_id_number_msg);
tvSexMsg = findViewById(R.id.tv_sex_msg);
tvCreateTimeMsg = findViewById(R.id.tv_create_time_msg);
tvEmailMsg = findViewById(R.id.tv_email_msg);
tvPhoneMsg = findViewById(R.id.tv_phone_msg);
tvIdNumber = findViewById(R.id.tv_id_number);
abIvTitle = findViewById(R.id.ab_iv_title);
intentActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
Intent data = result.getData();
int resultCode = result.getResultCode();
System.out.println("registerForActivityResult...........................");
if (resultCode == RESULT_OK) {
assert data != null;
getIntent().putExtras(data.getExtras());
refreshData();
}else if (resultCode == 100){
assert data != null;
ArrayList<String> images = data.getStringArrayListExtra(
ImageSelector.SELECT_RESULT);
}
});
refreshData();
initOnClickListener();
}
//用于图片选择器选择图片之后的回调,来完成图片上传和刷新本地
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 100 && data != null) {
//获取选择器返回的数据
ArrayList<String> images = data.getStringArrayListExtra(
ImageSelector.SELECT_RESULT);
String url = images.get(0);
Handler handler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
bundle = (Bundle) msg.obj;
if(bundle.getBoolean(UrlConstants.IS_IMG_UPLOAD_SUCCESS)){
System.out.println("refreshData..................");
getIntent().putExtras(bundle);
refreshData();
}else{
Toast.makeText(UserInfoDetail.this, "修改失败", Toast.LENGTH_SHORT).show();
}
}
};
ImgUploadUtil.userImgUpload(bundle, handler, url, ModelFieldConstants.AVATAR);
/**
*
* true
* true
*/
boolean isCameraImage = data.getBooleanExtra(ImageSelector.IS_CAMERA_IMAGE, false);
}
}
private void refreshData(){
bundle = getIntent().getExtras();
int roleId = bundle.getInt(ModelFieldConstants.ROLE_ID);
String avatar = (String) bundle.get(ModelFieldConstants.AVATAR);
String schoolName = (String) bundle.get(ModelFieldConstants.COLLEGE_NAME);
String userNameMsg = (String) bundle.get(ModelFieldConstants.USER_NAME);
String realNameMsg = (String) bundle.get(ModelFieldConstants.REAL_NAME);
Long idNumberMsg = (Long) bundle.get(ModelFieldConstants.ID_NUMBER);
Boolean sexMsg = bundle.getBoolean(ModelFieldConstants.GENDER);
Long createTimeMsg = (Long) bundle.get(ModelFieldConstants.CREATE_TIME);
String emailMsg = (String) bundle.get(ModelFieldConstants.EMAIL);
String phoneMsg = (String) bundle.get(ModelFieldConstants.PHONE);
if(roleId == 0){
ivHeadImg.setImageResource(R.mipmap.student);
tvIdNumber.setText("学号");
}
if(avatar != null){
Glide.with(getApplicationContext())
.load(avatar)
//添加圆角
.apply(new RequestOptions().bitmapTransform(new RoundedCorners(30)))
.into(ivHeadImg);
}
if(schoolName != null){
tvSchoolMsg.setText(schoolName);
}
if(userNameMsg != null){
tvUserNameMsg.setText(userNameMsg);
}
if(realNameMsg != null){
tvRealNameMsg.setText(realNameMsg);
}
if(idNumberMsg != null){
tvIdNumberMsg.setText(String.valueOf(idNumberMsg));
}
if(sexMsg != null){
if(sexMsg){
tvSexMsg.setText("男");
}else{
tvSexMsg.setText("女");
}
}
if(createTimeMsg != null){
Date date = new Date(createTimeMsg);
@SuppressLint("SimpleDateFormat")
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
tvCreateTimeMsg.setText(sd.format(date));
}
if(emailMsg != null){
tvEmailMsg.setText(emailMsg);
}
if(phoneMsg != null){
tvPhoneMsg.setText(phoneMsg);
}
}
/**
*
*/
public void initOnClickListener(){
//头像
clHeadImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//调用第三方开源库,单选并剪裁
ImageSelector.builder()
.useCamera(true) // 设置是否使用拍照
.setCrop(true) // 设置是否使用图片剪切功能。
.setCropRatio(1.0f) // 图片剪切的宽高比,默认1.0f。宽固定为手机屏幕的宽。
.setSingle(true) //设置是否单选
.canPreview(true) //是否可以预览图片默认为true
.start(UserInfoDetail.this, 100); // 打开相册
}
});
clUserName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(UserInfoDetail.this, ModifyUserInfo.class);
Bundle bundle = getIntent().getExtras();
bundle.putString(ModelFieldConstants.TO_BE_MODIFY, ModelFieldConstants.USER_NAME);
intent.putExtras(bundle);
intentActivityResultLauncher.launch(intent);
}
});
clSchoolName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(UserInfoDetail.this, ModifyUserInfo.class);
Bundle bundle = getIntent().getExtras();
bundle.putString(ModelFieldConstants.TO_BE_MODIFY, ModelFieldConstants.COLLEGE_NAME);
intent.putExtras(bundle);
intentActivityResultLauncher.launch(intent);
}
});
clRealName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(UserInfoDetail.this, ModifyUserInfo.class);
Bundle bundle = getIntent().getExtras();
bundle.putString(ModelFieldConstants.TO_BE_MODIFY, ModelFieldConstants.REAL_NAME);
intent.putExtras(bundle);
intentActivityResultLauncher.launch(intent);
}
});
clIdNumber.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(UserInfoDetail.this, ModifyUserInfo.class);
Bundle bundle = getIntent().getExtras();
bundle.putString(ModelFieldConstants.TO_BE_MODIFY, ModelFieldConstants.ID_NUMBER);
intent.putExtras(bundle);
intentActivityResultLauncher.launch(intent);
}
});
clSex.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(UserInfoDetail.this, ModifyUserInfo.class);
Bundle bundle = getIntent().getExtras();
bundle.putString(ModelFieldConstants.TO_BE_MODIFY, ModelFieldConstants.GENDER);
intent.putExtras(bundle);
intentActivityResultLauncher.launch(intent);
}
});
clCreateTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
clEmail.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(UserInfoDetail.this, ModifyUserInfo.class);
Bundle bundle = getIntent().getExtras();
bundle.putString(ModelFieldConstants.TO_BE_MODIFY, ModelFieldConstants.EMAIL);
intent.putExtras(bundle);
intentActivityResultLauncher.launch(intent);
}
});
clPhone.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(UserInfoDetail.this, ModifyUserInfo.class);
Bundle bundle = getIntent().getExtras();
bundle.putString(ModelFieldConstants.TO_BE_MODIFY, ModelFieldConstants.PHONE);
intent.putExtras(bundle);
intentActivityResultLauncher.launch(intent);
}
});
//返回上一个活动,也就是个人信息部分
abIvTitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtras(bundle);
setResult(RESULT_OK,intent);
finish();
}
});
}
}

@ -0,0 +1,43 @@
package com.example.stlink.activitys.fragmentChild.activityUserInfo;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.example.stlink.R;
import com.example.stlink.utils.CommonUtils;
public class UserInfoRecord extends AppCompatActivity {
private ImageView abIvTitle;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_detail_record);
initView();
}
private void initView(){
CommonUtils.changeStatusBar(this);
abIvTitle = findViewById(R.id.ab_iv_title);
setClickListener();
}
private void setClickListener(){
//返回上一个活动,也就是个人信息部分
abIvTitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}

@ -0,0 +1,67 @@
package com.example.stlink.activitys.fragmentChild.activityUserInfo;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.example.stlink.activitys.IdChooseActivity;
import com.example.stlink.R;
import com.example.stlink.utils.CommonUtils;
public class UserInfoSetting extends AppCompatActivity {
private Button btExit;
private Button btLoginOut;
private ImageView abIvTitle;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_detail_setting);
initView();
}
private void initView(){
CommonUtils.changeStatusBar(this);
btExit = findViewById(R.id.bt_exit);
btLoginOut = findViewById(R.id.bt_login_out);
abIvTitle = findViewById(R.id.ab_iv_title);
setClickListener();
}
private void setClickListener(){
btExit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// finish();//这个只是从方法栈中移除了当前活动
// System.exit(0); //同上
CommonUtils.exitApp(UserInfoSetting.this);
}
});
btLoginOut.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(UserInfoSetting.this, IdChooseActivity.class);
//退出登录后,禁止再退回来
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
});
//返回上一个活动,也就是个人信息部分
abIvTitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}

@ -0,0 +1,24 @@
package com.example.stlink.configs;
public interface IAdapter {
/*
* Item
*/
interface OnRVItemClickListener {
void onClick(int position);
}
/*
* Item
*/
interface OnRVItemLongClickListener {
boolean onLongClick(int position);
}
/*
* Item
*/
interface OnRVItemRemoveListener{
void onRemove(int position);
}
}

@ -0,0 +1,30 @@
package com.example.stlink.configs;
import android.app.Application;
import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.common.BaiduMapSDKException;
public class MapApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 是否同意隐私政策默认为false
SDKInitializer.setAgreePrivacy(this, true);
try {
// 在使用 SDK 各组间之前初始化 context 信息,传入 ApplicationContext
SDKInitializer.initialize(this);
} catch (BaiduMapSDKException e) {
e.printStackTrace();
}
//自4.3.0起百度地图SDK所有接口均支持百度坐标和国测局坐标用此方法设置您使用的坐标类型.
//包括BD09LL和GCJ02两种坐标默认是BD09LL坐标。
SDKInitializer.setCoordType(CoordType.BD09LL);
}
}

@ -0,0 +1,38 @@
package com.example.stlink.configs;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
/**
*
*/
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
private final String SQL_CREATE_ENTRIES;
private final String SQL_DELETE_ENTRIES;
public MySQLiteOpenHelper(@Nullable Context context,
@Nullable String dbName,
@Nullable SQLiteDatabase.CursorFactory factory,
int version,
@Nullable String sqlCreateEntries,
@Nullable String sqlDeleteEntries) {
super(context, dbName, factory, version);
SQL_CREATE_ENTRIES = sqlCreateEntries;
SQL_DELETE_ENTRIES = sqlDeleteEntries;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE_ENTRIES);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(SQL_DELETE_ENTRIES);
onCreate(db);
}
}

@ -0,0 +1,88 @@
package com.example.stlink.configs.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.example.stlink.R;
import com.example.stlink.model.domain.Course;
import java.util.List;
/**
* ListView
*/
public class CourseChooseAdapter extends RecyclerView.Adapter<CourseChooseAdapter.ViewHolder> implements View.OnClickListener {
private com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener;
private RecyclerView rvParent;
private final List<Course> mCourseData;
private final Context mContext;
private final int resourceId;
public CourseChooseAdapter(@NonNull Context context, int resourceId, @NonNull List<Course> data) {
this.mContext = context;
this.mCourseData = data;
this.resourceId = resourceId;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//指定一个父控件
rvParent = (RecyclerView) parent;
View view = LayoutInflater.from(mContext)
.inflate(resourceId, parent, false);
ViewHolder holder = new ViewHolder(view);
view.setOnClickListener(this);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Course course = mCourseData.get(position);
Glide.with(mContext).load(course.getmCoursePhoto()).into(holder.ivCoursePhoto);
holder.tvCourseName.setText(course.getmCourseName());
}
@Override
public int getItemCount() {
return mCourseData.size();
}
//重载点击事件指定点击事件时执行自定义的onItemClick
@Override
public void onClick(View view) {
int position = rvParent.getChildAdapterPosition(view);
if (onRecyclerViewItemClickListener != null){
onRecyclerViewItemClickListener.onItemClick(rvParent, view, position);
}
}
//实例化自定义接口
public void setOnItemClickListener(com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener) {
this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener;
}
static class ViewHolder extends RecyclerView.ViewHolder {
ImageView ivCoursePhoto;
TextView tvCourseName;
public ViewHolder(@NonNull View itemView) {
super(itemView);
ivCoursePhoto = itemView.findViewById(R.id.iv_course_photo);
tvCourseName = itemView.findViewById(R.id.tv_course_name);
}
}
}

@ -0,0 +1,93 @@
package com.example.stlink.configs.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.baidu.mapapi.search.core.PoiInfo;
import com.example.stlink.R;
import java.util.List;
/**
* ListView
*/
public class LocationPoiAdapter extends RecyclerView.Adapter<LocationPoiAdapter.ViewHolder> implements View.OnClickListener {
private com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener;
private RecyclerView rvParent;
private List<PoiInfo> mItems;
private final Context mContext;
// private LayoutInflater mInflater;
public LocationPoiAdapter(@NonNull Context mContext, @NonNull List<PoiInfo> mItems) {
this.mItems = mItems;
this.mContext = mContext;
// this.mInflater=LayoutInflater.from(mContext);
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//指定一个父控件
rvParent = (RecyclerView) parent;
View view = LayoutInflater.from(mContext)
.inflate(R.layout.card_location_poi, parent, false);
view.setOnClickListener(this);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.tvBuildingName.setText(mItems.get(position).name);
holder.tvBuildingDescription.setText(mItems.get(position).address);
System.out.println("LocationPoiAdapter : holder : " + holder);
}
@Override
public int getItemCount() {
return mItems.size();
}
//重载点击事件指定点击事件时执行自定义的onItemClick
@Override
public void onClick(View view) {
int position = rvParent.getChildAdapterPosition(view);
if (onRecyclerViewItemClickListener != null){
onRecyclerViewItemClickListener.onItemClick(rvParent, view, position);
}
}
//实例化自定义接口
public void setOnItemClickListener(com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener) {
this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener;
}
static class ViewHolder extends RecyclerView.ViewHolder {
TextView tvBuildingName;
TextView tvBuildingDescription;
public ViewHolder(@NonNull View itemView) {
super(itemView);
tvBuildingName = itemView.findViewById(R.id.tv_building_name);
tvBuildingDescription = itemView.findViewById(R.id.tv_building_description);
}
@Override
public String toString() {
return "ViewHolder{" +
"tvBuildingName=" + tvBuildingName +
", tvBuildingDescription=" + tvBuildingDescription +
'}';
}
}
}

@ -0,0 +1,189 @@
package com.example.stlink.configs.adapter;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.example.stlink.R;
import com.example.stlink.fragments.StuHomeFragment;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.model.constants.UrlConstants;
import com.example.stlink.model.domain.Course;
import com.example.stlink.model.response.BaseResponse;
import com.example.stlink.utils.httpUtils.PostBodyParamHttpUtils;
import java.util.List;
/**
* ListView
*/
public class StuAddCourseAdapter extends RecyclerView.Adapter<StuAddCourseAdapter.ViewHolder> implements View.OnClickListener {
private com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener;
private RecyclerView rvParent;
private final List<Course> mCourseData;
private final Context mContext;
private final int resourceId;
private int role;
private Handler handler;
public StuAddCourseAdapter(@NonNull Context context, int resourceId, @NonNull List<Course> data, int role) {
this.mContext = context;
this.mCourseData = data;
this.resourceId = resourceId;
this.role = role;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//指定一个父控件
rvParent = (RecyclerView) parent;
View view = LayoutInflater.from(mContext)
.inflate(resourceId, parent, false);
ViewHolder holder = new ViewHolder(view);
view.setOnClickListener(this);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Course course = mCourseData.get(position);
Glide.with(mContext).load(course.getmCoursePhoto()).into(holder.ivCoursePhoto);
holder.tvCourseName.setText(course.getmCourseName());
holder.tvCollegeName.setText(course.getmCollegeName());
setAddClickListener(holder, position);
}
@Override
public int getItemCount() {
return mCourseData.size();
}
//重载点击事件指定点击事件时执行自定义的onItemClick
@Override
public void onClick(View view) {
int position = rvParent.getChildAdapterPosition(view);
if (onRecyclerViewItemClickListener != null){
onRecyclerViewItemClickListener.onItemClick(rvParent, view, position);
}
}
//实例化自定义接口
public void setOnItemClickListener(com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener) {
this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener;
}
static class ViewHolder extends RecyclerView.ViewHolder {
ImageView ivCoursePhoto;
TextView tvCourseName;
TextView tvCollegeName;
ImageView ivRight;
public ViewHolder(@NonNull View itemView) {
super(itemView);
ivCoursePhoto = itemView.findViewById(R.id.iv_course_photo);
tvCourseName = itemView.findViewById(R.id.tv_course_name);
tvCollegeName = itemView.findViewById(R.id.tv_college_name);
ivRight = itemView.findViewById(R.id.cv_right);
}
}
/**
* 线线
* @param holder card
* @param position
*/
public void setAddClickListener(ViewHolder holder, int position){
holder.ivRight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog alertDialog2 = new AlertDialog.Builder(mContext)
.setMessage("确认加入课程")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {//添加"Yes"按钮
@Override
public void onClick(DialogInterface dialogInterface, int i) {
deleteCourse(position);
handler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Toast.makeText(mContext, msg.obj.toString(), Toast.LENGTH_SHORT).show();
if(msg.arg1 == 200){
Toast.makeText(mContext, "添加成功", Toast.LENGTH_SHORT).show();
AppCompatActivity appCompatActivity = (AppCompatActivity) mContext;
appCompatActivity.finish();
//刷新数据
StuHomeFragment.refreshData();
}
}
};
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {//添加取消
@Override
public void onClick(DialogInterface dialogInterface, int i) { }
})
.create();
alertDialog2.show();
}
});
}
/**
*
*/
private void deleteCourse(int position){
new Thread(new Runnable() {
@Override
public void run() {
AppCompatActivity appCompatActivity = (AppCompatActivity) mContext;
Bundle bundle = appCompatActivity.getIntent().getExtras();
Long courseId = mCourseData.get(position).getmCourseId();
long userId = bundle.getLong(ModelFieldConstants.ID);
String urlParam = ModelFieldConstants.COURSE_ID + "=" + courseId + "&" +
ModelFieldConstants.USER_ID + "=" + userId;
String url = UrlConstants.STUDENT_SELECT + "?" + urlParam;
new PostBodyParamHttpUtils() {
@Override
public void nextMethod(BaseResponse<Object> baseResponse) {
Message message = new Message();
message.obj = "添加成功";
message.arg1 = 200;
handler.sendMessage(message);
}
@Override
public void failedMethod(BaseResponse<Object> baseResponse) {
Message message = new Message();
System.out.println("添加失败.......................");
message.obj = "添加失败";
message.arg1 = 400;
handler.sendMessage(message);
}
}.postConnect(url, "");
}
}).start();
}
}

@ -0,0 +1,98 @@
package com.example.stlink.configs.adapter;
import android.content.Context;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.stlink.R;
import com.example.stlink.model.domain.CourseSign;
import com.example.stlink.utils.CommonUtils;
import java.util.List;
/**
* ListView
*/
public class StuClassListFragAdapter extends RecyclerView.Adapter<StuClassListFragAdapter.ViewHolder> implements View.OnClickListener {
private com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener;
private RecyclerView rvParent;
private final List<CourseSign> mCourseSign;
private final Context mContext;
private final int resourceId;
private int role;
private Handler handler;
public StuClassListFragAdapter(@NonNull Context context, int resourceId, @NonNull List<CourseSign> mCourseSign, int role) {
this.mContext = context;
this.mCourseSign = mCourseSign;
this.resourceId = resourceId;
this.role = role;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//指定一个父控件
rvParent = (RecyclerView) parent;
View view = LayoutInflater.from(mContext)
.inflate(resourceId, parent, false);
ViewHolder holder = new ViewHolder(view);
view.setOnClickListener(this);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
CourseSign courseSign = mCourseSign.get(position);
System.out.println("mCourseSign[" + position + "]: " + courseSign);
holder.tvCourseName.setText(courseSign.getCourseName());
holder.tvSignAddress.setText(courseSign.getCourseAddr());
Long signCreateTime = courseSign.getCreateTime();
holder.tvCreateTime.setText(CommonUtils.stampToDate(String.valueOf(signCreateTime), "yyyy-MM-dd hh:mm:ss"));
}
@Override
public int getItemCount() {
return mCourseSign.size();
}
//重载点击事件指定点击事件时执行自定义的onItemClick
@Override
public void onClick(View view) {
int position = rvParent.getChildAdapterPosition(view);
if (onRecyclerViewItemClickListener != null){
onRecyclerViewItemClickListener.onItemClick(rvParent, view, position);
}
}
//实例化自定义接口
public void setOnItemClickListener(com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener) {
this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener;
}
static class ViewHolder extends RecyclerView.ViewHolder {
TextView tvCourseName;
TextView tvSignAddress;
TextView tvCreateTime;
public ViewHolder(@NonNull View itemView) {
super(itemView);
tvCourseName = itemView.findViewById(R.id.tv_class_list_title);
tvSignAddress = itemView.findViewById(R.id.tv_sign_address);
tvCreateTime = itemView.findViewById(R.id.tv_create_time);
}
}
}

@ -0,0 +1,76 @@
package com.example.stlink.configs.adapter;
import android.content.Context;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.stlink.R;
import com.example.stlink.model.domain.CourseSign;
import com.example.stlink.utils.CommonUtils;
import java.util.List;
/**
* ListView
*/
public class StuCourseSignedAdapter extends RecyclerView.Adapter<StuCourseSignedAdapter.ViewHolder>{
private RecyclerView rvParent;
private final List<CourseSign> mCourseSign;
private final Context mContext;
private final int resourceId;
private int role;
private Handler handler;
public StuCourseSignedAdapter(@NonNull Context context, int resourceId, @NonNull List<CourseSign> mCourseSign, int role) {
this.mContext = context;
this.mCourseSign = mCourseSign;
this.resourceId = resourceId;
this.role = role;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//指定一个父控件
rvParent = (RecyclerView) parent;
View view = LayoutInflater.from(mContext)
.inflate(resourceId, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
CourseSign courseSign = mCourseSign.get(position);
System.out.println("mCourseSign[" + position + "]: " + courseSign);
Long signedTimeStamp = courseSign.getCreateTime();
holder.tvSignedTime.setText(CommonUtils.stampToDate(String.valueOf(signedTimeStamp), "yyyy-MM-dd hh:mm:ss"));
}
@Override
public int getItemCount() {
return mCourseSign.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
TextView tvSignedTime;
public ViewHolder(@NonNull View itemView) {
super(itemView);
tvSignedTime = itemView.findViewById(R.id.tv_signed_time);
}
}
}

@ -0,0 +1,186 @@
package com.example.stlink.configs.adapter;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.example.stlink.R;
import com.example.stlink.fragments.StuHomeFragment;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.model.constants.UrlConstants;
import com.example.stlink.model.domain.Course;
import com.example.stlink.model.response.BaseResponse;
import com.example.stlink.utils.httpUtils.DeleteUrlParamHttpUtils;
import java.util.List;
/**
* ListView
*/
public class StuDeleteCourseAdapter extends RecyclerView.Adapter<StuDeleteCourseAdapter.ViewHolder> implements View.OnClickListener {
private com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener;
private RecyclerView rvParent;
private final List<Course> mCourseData;
private final Context mContext;
private final int resourceId;
private int role;
private Handler handler;
public StuDeleteCourseAdapter(@NonNull Context context, int resourceId, @NonNull List<Course> data, int role) {
this.mContext = context;
this.mCourseData = data;
this.resourceId = resourceId;
this.role = role;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//指定一个父控件
rvParent = (RecyclerView) parent;
View view = LayoutInflater.from(mContext)
.inflate(resourceId, parent, false);
ViewHolder holder = new ViewHolder(view);
view.setOnClickListener(this);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Course course = mCourseData.get(position);
Glide.with(mContext).load(course.getmCoursePhoto()).into(holder.ivCoursePhoto);
holder.tvCourseName.setText(course.getmCourseName());
holder.tvCollegeName.setText(course.getmCollegeName());
setDeleteClickListener(holder, position);
}
@Override
public int getItemCount() {
return mCourseData.size();
}
//重载点击事件指定点击事件时执行自定义的onItemClick
@Override
public void onClick(View view) {
int position = rvParent.getChildAdapterPosition(view);
if (onRecyclerViewItemClickListener != null){
onRecyclerViewItemClickListener.onItemClick(rvParent, view, position);
}
}
//实例化自定义接口
public void setOnItemClickListener(com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener) {
this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener;
}
static class ViewHolder extends RecyclerView.ViewHolder {
ImageView ivCoursePhoto;
TextView tvCourseName;
TextView tvCollegeName;
ImageView ivRight;
public ViewHolder(@NonNull View itemView) {
super(itemView);
ivCoursePhoto = itemView.findViewById(R.id.iv_course_photo);
tvCourseName = itemView.findViewById(R.id.tv_course_name);
tvCollegeName = itemView.findViewById(R.id.tv_college_name);
ivRight = itemView.findViewById(R.id.cv_right);
}
}
/**
* 线线
* @param holder
* @param position
*/
public void setDeleteClickListener(ViewHolder holder, int position){
holder.ivRight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog alertDialog2 = new AlertDialog.Builder(mContext)
.setMessage("确认退出课程")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {//添加"Yes"按钮
@Override
public void onClick(DialogInterface dialogInterface, int i) {
deleteCourse(position);
handler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Toast.makeText(mContext, msg.obj.toString(), Toast.LENGTH_SHORT).show();
if(msg.arg1 == 200){
StuHomeFragment.refreshData();
}
}
};
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {//添加取消
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
})
.create();
alertDialog2.show();
}
});
}
/**
*
*/
private void deleteCourse(int position){
new Thread(new Runnable() {
@Override
public void run() {
AppCompatActivity appCompatActivity = (AppCompatActivity) mContext;
Bundle bundle = appCompatActivity.getIntent().getExtras();
Long courseId = mCourseData.get(position).getmCourseId();
Long userId = bundle.getLong(ModelFieldConstants.ID);
String urlParam = ModelFieldConstants.COURSE_ID + "=" + courseId + "&" +
ModelFieldConstants.USER_ID + "=" + userId;
String url = UrlConstants.STUDENT_DROP + "?" + urlParam;
new DeleteUrlParamHttpUtils() {
@Override
public void nextMethod(BaseResponse<Object> baseResponse) {
Message message = new Message();
message.obj = "退出成功";
message.arg1 = 200;
handler.sendMessage(message);
}
@Override
public void failedMethod(BaseResponse<Object> baseResponse) {
Message message = new Message();
System.out.println("退出失败.......................");
message.obj = "退出失败";
message.arg1 = 400;
handler.sendMessage(message);
}
}.deleteConnect(url);
}
}).start();
}
}

@ -0,0 +1,191 @@
package com.example.stlink.configs.adapter;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.example.stlink.R;
import com.example.stlink.fragments.CrsFinishedListFragment;
import com.example.stlink.fragments.CrsUnfinishedListFragment;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.model.constants.UrlConstants;
import com.example.stlink.model.domain.Course;
import com.example.stlink.model.response.BaseResponse;
import com.example.stlink.utils.httpUtils.DeleteUrlParamHttpUtils;
import java.util.List;
/**
* ListView
*/
public class TeaDeleteCourseAdapter extends RecyclerView.Adapter<TeaDeleteCourseAdapter.ViewHolder> implements View.OnClickListener {
private com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener;
private RecyclerView rvParent;
private final List<Course> mCourseData;
private final Context mContext;
private final int resourceId;
private int role;
private Handler handler;
public TeaDeleteCourseAdapter(@NonNull Context context, int resourceId, @NonNull List<Course> data, int role) {
this.mContext = context;
this.mCourseData = data;
this.resourceId = resourceId;
this.role = role;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//指定一个父控件
rvParent = (RecyclerView) parent;
View view = LayoutInflater.from(mContext)
.inflate(resourceId, parent, false);
ViewHolder holder = new ViewHolder(view);
view.setOnClickListener(this);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Course course = mCourseData.get(position);
Glide.with(mContext).load(course.getmCoursePhoto()).into(holder.ivCoursePhoto);
holder.tvCourseName.setText(course.getmCourseName());
holder.tvCollegeName.setText(course.getmCollegeName());
setDeleteClickListener(holder, position);
}
@Override
public int getItemCount() {
return mCourseData.size();
}
//重载点击事件指定点击事件时执行自定义的onItemClick
@Override
public void onClick(View view) {
int position = rvParent.getChildAdapterPosition(view);
if (onRecyclerViewItemClickListener != null){
onRecyclerViewItemClickListener.onItemClick(rvParent, view, position);
}
}
//实例化自定义接口
public void setOnItemClickListener(com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener) {
this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener;
}
static class ViewHolder extends RecyclerView.ViewHolder {
ImageView ivCoursePhoto;
TextView tvCourseName;
TextView tvCollegeName;
ImageView ivRight;
public ViewHolder(@NonNull View itemView) {
super(itemView);
ivCoursePhoto = itemView.findViewById(R.id.iv_course_photo);
tvCourseName = itemView.findViewById(R.id.tv_course_name);
tvCollegeName = itemView.findViewById(R.id.tv_college_name);
ivRight = itemView.findViewById(R.id.cv_right);
}
}
/**
* 线线
* @param holder
* @param position
*/
public void setDeleteClickListener(ViewHolder holder, int position){
holder.ivRight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog alertDialog2 = new AlertDialog.Builder(mContext)
.setMessage("确认删除课程")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {//添加"Yes"按钮
@Override
public void onClick(DialogInterface dialogInterface, int i) {
deleteCourse(position);
handler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Toast.makeText(mContext, msg.obj.toString(), Toast.LENGTH_SHORT).show();
if(msg.arg1 == 200){
if(role == 0){
CrsUnfinishedListFragment.refreshData();
}else if (role == 1){
CrsFinishedListFragment.refreshData();
}
}
}
};
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {//添加取消
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
})
.create();
alertDialog2.show();
}
});
}
/**
*
*/
private void deleteCourse(int position){
new Thread(new Runnable() {
@Override
public void run() {
AppCompatActivity appCompatActivity = (AppCompatActivity) mContext;
Bundle bundle = appCompatActivity.getIntent().getExtras();
Long courseId = mCourseData.get(position).getmCourseId();
Long userId = bundle.getLong(ModelFieldConstants.ID);
String urlParam = ModelFieldConstants.COURSE_ID + "=" + courseId + "&" +
ModelFieldConstants.USER_ID + "=" + userId;
String url = UrlConstants.TEACHER_COURSE + "?" + urlParam;
new DeleteUrlParamHttpUtils() {
@Override
public void nextMethod(BaseResponse<Object> baseResponse) {
Message message = new Message();
message.obj = "删除成功";
message.arg1 = 200;
handler.sendMessage(message);
}
@Override
public void failedMethod(BaseResponse<Object> baseResponse) {
Message message = new Message();
System.out.println("删除失败.......................");
message.obj = "删除失败";
message.arg1 = 400;
handler.sendMessage(message);
}
}.deleteConnect(url);
}
}).start();
}
}

@ -0,0 +1,39 @@
package com.example.stlink.configs.adapter;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.Lifecycle;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import java.util.List;
/**
*
*/
public class ViewPagerAdapter extends FragmentStateAdapter {
List<Fragment> list;
public ViewPagerAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle , List<Fragment> list) {
super(fragmentManager, lifecycle);
this.list = list;
}
public ViewPagerAdapter(@NonNull FragmentActivity fragmentActivity, List<Fragment> list) {
super(fragmentActivity);
this.list = list;
}
@Override
public int getItemCount() {
return list.size();
}
@NonNull
@Override
public Fragment createFragment(int position) {
return list.get(position);
}
}

@ -0,0 +1,20 @@
package com.example.stlink.configs.myControls;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;
/**
* ListViewScrollView
*/
public class MyListView extends ListView {
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandedSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandedSpec);
}
}

@ -0,0 +1,143 @@
package com.example.stlink.configs.myControls;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewParent;
import android.widget.FrameLayout;
import java.util.HashMap;
import androidx.annotation.Nullable;
import androidx.viewpager2.widget.ViewPager2;
/**
* ViewPager2 ViewPager2 RecyclerView
*/
public class NestedScrollableHost extends FrameLayout {
private int touchSlop;
private float initialX;
private float initialY;
private HashMap _$_findViewCache;
private final ViewPager2 getParentViewPager() {
ViewParent var10000 = this.getParent();
if (!(var10000 instanceof View)) {
var10000 = null;
}
View v;
for (v = (View) var10000; v != null && !(v instanceof ViewPager2); v = (View) var10000) {
var10000 = v.getParent();
if (!(var10000 instanceof View)) {
var10000 = null;
}
}
View var2 = v;
if (!(v instanceof ViewPager2)) {
var2 = null;
}
return (ViewPager2) var2;
}
private final View getChild() {
return this.getChildCount() > 0 ? this.getChildAt(0) : null;
}
private final boolean canChildScroll(int orientation, float delta) {
boolean var5 = false;
int direction = -((int) Math.signum(delta));
View var10000;
boolean var6 = false;
switch (orientation) {
case 0:
var10000 = this.getChild();
var6 = var10000 != null ? var10000.canScrollHorizontally(direction) : false;
break;
case 1:
var10000 = this.getChild();
var6 = var10000 != null ? var10000.canScrollVertically(direction) : false;
break;
default:
// throw (Throwable)(new IllegalArgumentException());
}
return var6;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
this.handleInterceptTouchEvent(e);
return super.onInterceptTouchEvent(e);
}
private final void handleInterceptTouchEvent(MotionEvent e) {
ViewPager2 var10000 = this.getParentViewPager();
if (var10000 != null) {
int orientation = var10000.getOrientation();
if (this.canChildScroll(orientation, -1.0F) || this.canChildScroll(orientation, 1.0F)) {
if (e.getAction() == 0) {
this.initialX = e.getX();
this.initialY = e.getY();
this.getParent().requestDisallowInterceptTouchEvent(true);
} else if (e.getAction() == 2) {
float dx = e.getX() - this.initialX;
float dy = e.getY() - this.initialY;
boolean isVpHorizontal = orientation == 0;
boolean var8 = false;
float scaledDx = Math.abs(dx) * (isVpHorizontal ? 0.5F : 1.0F);
boolean var9 = false;
float scaledDy = Math.abs(dy) * (isVpHorizontal ? 1.0F : 0.5F);
if (scaledDx > (float) this.touchSlop || scaledDy > (float) this.touchSlop) {
if (isVpHorizontal == scaledDy > scaledDx) {
this.getParent().requestDisallowInterceptTouchEvent(false);
} else if (this.canChildScroll(orientation, isVpHorizontal ? dx : dy)) {
this.getParent().requestDisallowInterceptTouchEvent(true);
} else {
this.getParent().requestDisallowInterceptTouchEvent(false);
}
}
}
}
}
}
public NestedScrollableHost(Context context) {
super(context);
ViewConfiguration var10001 = ViewConfiguration.get(this.getContext());
this.touchSlop = var10001.getScaledTouchSlop();
}
public NestedScrollableHost(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
ViewConfiguration var10001 = ViewConfiguration.get(this.getContext());
this.touchSlop = var10001.getScaledTouchSlop();
}
public View _$_findCachedViewById(int var1) {
if (this._$_findViewCache == null) {
this._$_findViewCache = new HashMap();
}
View var2 = (View) this._$_findViewCache.get(var1);
if (var2 == null) {
var2 = this.findViewById(var1);
this._$_findViewCache.put(var1, var2);
}
return var2;
}
public void _$_clearFindViewByIdCache() {
if (this._$_findViewCache != null) {
this._$_findViewCache.clear();
}
}
}

@ -0,0 +1,10 @@
package com.example.stlink.configs;
import android.view.View;
import androidx.recyclerview.widget.RecyclerView;
public interface onRecyclerViewItemClickListener{
void onItemClick(RecyclerView parent, View view, int position);
void onItemLongClick(RecyclerView parent, View view, int position);
}

@ -0,0 +1,48 @@
package com.example.stlink.fragments;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import com.example.stlink.R;
public class CourseClassListFragment extends Fragment {
private static AppCompatActivity originalActivity;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_course_class_list, container, false);
initView(view);
return view;
}
/**
*
* @param str
* @param appCompatActivity
* @return
*/
public static CourseClassListFragment newInstance(String str, AppCompatActivity appCompatActivity){
CourseClassListFragment courseClassListFragment = new CourseClassListFragment();
originalActivity = appCompatActivity;
return courseClassListFragment;
}
/**
*
* @param view
*/
private void initView(View view) {
}
}

@ -0,0 +1,128 @@
package com.example.stlink.fragments;
import android.content.Intent;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import com.bumptech.glide.Glide;
import com.example.stlink.R;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.model.response.data.CourseDetailData;
import com.example.stlink.utils.CommonUtils;
public class CourseIntroMsgFragment extends Fragment {
private static AppCompatActivity mAppCompatActivity;
private static ImageView ivCourseImg;
private static TextView tvCourseDescriptionMsg;
private static TextView tvCourseCreateTimeMsg;
private static TextView tvCourseStartTimeMsg;
private static TextView tvCourseEndTimeMsg;
private static TextView tvCourseStatusMsg;
private static CourseDetailData courseDetailData;
private static View mView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_course_intro_msg, container, false);
initView(view);
mView = view;
return view;
}
@Override
public void onResume() {
super.onResume();
}
/**
*
* @param str
* @param appCompatActivity
* @return
*/
public static CourseIntroMsgFragment newInstance(String str, AppCompatActivity appCompatActivity){
CourseIntroMsgFragment courseIntroMsgFragment = new CourseIntroMsgFragment();
mAppCompatActivity = appCompatActivity;
return courseIntroMsgFragment;
}
/**
*
* @param view
*/
private static void initView(View view) {
ivCourseImg = view.findViewById(R.id.iv_course_img);
tvCourseDescriptionMsg = view.findViewById(R.id.tv_course_description_msg);
tvCourseCreateTimeMsg = view.findViewById(R.id.tv_course_create_time_msg);
tvCourseStartTimeMsg = view.findViewById(R.id.tv_course_start_time_msg);
tvCourseEndTimeMsg = view.findViewById(R.id.tv_course_end_time_msg);
tvCourseStatusMsg = view.findViewById(R.id.tv_course_status_msg);
//内容超出文本框大小,支持滑动
tvCourseDescriptionMsg.setMovementMethod(ScrollingMovementMethod.getInstance());
}
/**
*
* @param intent
*/
public static void freshData(Intent intent){
courseDetailData = (CourseDetailData) intent.getExtras().getSerializable(ModelFieldConstants.COURSE_DETAIL_DATA);
System.out.println("initView: courseDetailData = " + courseDetailData);
if(courseDetailData == null){
return;
}
String courseImg = courseDetailData.getCoursePhoto();
String courseIntro = courseDetailData.getIntroduce();
Long courseCreateTime = courseDetailData.getCreateTime();
Long courseStartTime = courseDetailData.getStartTime();
Long courseEndTime = courseDetailData.getEndTime();
if(courseImg != null){
Glide.with(mAppCompatActivity)
.load(courseImg)
.into(ivCourseImg);
}
if(courseIntro != null){
tvCourseDescriptionMsg.setText(courseIntro);
}
if(courseCreateTime != null){
String startFormDate = CommonUtils.stampToDate(String.valueOf(courseCreateTime), "yyyy年MM月dd日");
tvCourseCreateTimeMsg.setText(startFormDate);
}
if(courseStartTime != null){
String startFormDate = CommonUtils.stampToDate(String.valueOf(courseStartTime), "yyyy年MM月dd日");
tvCourseStartTimeMsg.setText(startFormDate);
}
if(courseEndTime != null){
String startFormDate = CommonUtils.stampToDate(String.valueOf(courseEndTime), "yyyy年MM月dd日");
tvCourseEndTimeMsg.setText(startFormDate);
}
long currTime = System.currentTimeMillis();
if(courseEndTime != null && currTime <= courseEndTime){
tvCourseStatusMsg.setText("未完结");
}else{
tvCourseStatusMsg.setText("已完结");
}
}
}

@ -0,0 +1,78 @@
package com.example.stlink.fragments;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.Fragment;
import com.example.stlink.R;
public class CourseSelectedStuFragment extends Fragment {
private static AppCompatActivity mAppCompatActivity;
private ConstraintLayout stu1;
private ConstraintLayout stu2;
private ConstraintLayout stu3;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_course_selected_stu, container, false);
initView(view);
return view;
}
/**
*
* @param str
* @param appCompatActivity
* @return
*/
public static CourseSelectedStuFragment newInstance(String str, AppCompatActivity appCompatActivity){
CourseSelectedStuFragment courseSelectedStuFragment = new CourseSelectedStuFragment();
mAppCompatActivity = appCompatActivity;
return courseSelectedStuFragment;
}
/**
*
* @param view
*/
private void initView(View view) {
stu1 = view.findViewById(R.id.stu_1);
stu2 = view.findViewById(R.id.stu_2);
stu3 = view.findViewById(R.id.stu_3);
setClickListener();
}
private void setClickListener(){
stu1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
stu2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
stu3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
}

@ -0,0 +1,192 @@
package com.example.stlink.fragments;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.example.stlink.R;
import com.example.stlink.configs.adapter.TeaDeleteCourseAdapter;
import com.example.stlink.configs.onRecyclerViewItemClickListener;
import com.example.stlink.activitys.fragmentChild.activityTeaCourse.CourseDetail;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.model.constants.UrlConstants;
import com.example.stlink.model.domain.Course;
import com.example.stlink.model.response.BaseResponse;
import com.example.stlink.model.response.data.CourseData;
import com.example.stlink.utils.httpUtils.GetUrlParamHttpUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.internal.LinkedTreeMap;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
import java.util.List;
/**
*
*/
public class CrsFinishedListFragment extends Fragment {
private static RecyclerView lvFinishedCourseList;
private static List<Course> coursesData;
private static TeaDeleteCourseAdapter adapter;
private static AppCompatActivity mAppCompatActivity;
private static SwipeRefreshLayout srlMyRefresh;
private int mPage = 1;
private int mCurrentColIndex = 0;
private static Bundle bundle;
private static Handler handler;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_course_finished, container, false);
initView(view);
return view;
}
/**
*
* @param str
* @param appCompatActivity
* @return
*/
public static CrsFinishedListFragment newInstance(String str, AppCompatActivity appCompatActivity){
CrsFinishedListFragment unfinishedFra = new CrsFinishedListFragment();
mAppCompatActivity = appCompatActivity;
return unfinishedFra;
}
/**
*
* @param view
*/
private void initView(View view) {
lvFinishedCourseList = view.findViewById(R.id.lv_finished_course_list);
srlMyRefresh = view.findViewById(R.id.srl_my_refresh);
srlMyRefresh.setColorSchemeColors(Color.parseColor("#ff0000"),Color.parseColor("#00ff00"));
refreshData();
}
public static void refreshData(){
coursesData = new ArrayList<>();
adapter = new TeaDeleteCourseAdapter(
mAppCompatActivity,
R.layout.card_course_tea,
coursesData,
1
);
LinearLayoutManager llm = new LinearLayoutManager(mAppCompatActivity);
lvFinishedCourseList.setLayoutManager(llm);
lvFinishedCourseList.setAdapter(adapter);
bundle = mAppCompatActivity.getIntent().getExtras();
handler = new Handler(Looper.getMainLooper()){
@SuppressLint("NotifyDataSetChanged")
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
CourseData courseData = (CourseData) msg.obj;
coursesData.addAll(courseData.getRecords());
adapter.notifyDataSetChanged();
}
};
getUnfinishedCourseList();
setListener();
}
/**
*
*/
public static void setListener(){
adapter.setOnItemClickListener(new onRecyclerViewItemClickListener() {
@Override
public void onItemClick(RecyclerView parent, View view, int position) {
Intent intent = new Intent(mAppCompatActivity, CourseDetail.class);
bundle = mAppCompatActivity.getIntent().getExtras();
//将position传入bundle
Long courseId = coursesData.get(position).getmCourseId();
bundle.putLong(ModelFieldConstants.COURSE_ID, courseId);
System.out.println("courseId == " + courseId);
System.out.println("course == " + coursesData.get(position));
System.out.println("bundle:courseId == " + bundle.getLong(ModelFieldConstants.COURSE_ID));
System.out.println("bundle:userId == " + bundle.getLong(ModelFieldConstants.USER_ID));
intent.putExtras(bundle);
mAppCompatActivity.startActivity(intent);
}
@Override
public void onItemLongClick(RecyclerView parent, View view, int position) { }
});
srlMyRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
refreshData();
srlMyRefresh.setRefreshing(false);
}
});
}
private static void getUnfinishedCourseList(){
new Thread(new Runnable() {
final String urlParam = ModelFieldConstants.USER_ID + "=" + bundle.getLong(ModelFieldConstants.ID);
final String url = UrlConstants.TEACHER_FINISHED + "?" + urlParam;
@Override
public void run() {
new GetUrlParamHttpUtils() {
@Override
public void nextMethod(BaseResponse<Object> baseResponse) {
System.out.println("courseDataBaseResponse.getData() = " + baseResponse.getData() + "...............");
//解析数据
Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
Object obj = baseResponse.getData();
LinkedTreeMap<String, String> courseDataMap = null;
if(obj instanceof LinkedTreeMap){
courseDataMap = (LinkedTreeMap<String, String>) obj;
}
//将LinkedTreeMap中字段映射到CourseData类中
String jsonString = gson.toJson(courseDataMap);
CourseData<Course> courseData = gson.fromJson(jsonString, new TypeToken<CourseData<Course>>() {}.getType());
System.out.println("courseData = " + courseData);
if(courseData != null){
Message message = new Message();
message.obj = courseData;
handler.sendMessage(message);
}else{
System.out.println("courseData: null " + "...............................");
}
}
@Override
public void failedMethod(BaseResponse<Object> baseResponse) { }
}.getConnect(url);
}
}).start();
}
}

@ -0,0 +1,196 @@
package com.example.stlink.fragments;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.example.stlink.R;
import com.example.stlink.configs.adapter.TeaDeleteCourseAdapter;
import com.example.stlink.configs.onRecyclerViewItemClickListener;
import com.example.stlink.activitys.fragmentChild.activityTeaCourse.CourseDetail;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.model.constants.UrlConstants;
import com.example.stlink.model.domain.Course;
import com.example.stlink.model.response.BaseResponse;
import com.example.stlink.model.response.data.CourseData;
import com.example.stlink.utils.httpUtils.GetUrlParamHttpUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.internal.LinkedTreeMap;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
import java.util.List;
/**
*
*/
public class CrsUnfinishedListFragment extends Fragment {
private static RecyclerView lvUnfinishedCourseList;
private static List<Course> coursesData;
private static TeaDeleteCourseAdapter adapter;
private static AppCompatActivity mAppCompatActivity;
private static SwipeRefreshLayout srlMyRefresh;
private int mPage = 1;
private int mCurrentColIndex = 0;
private static Bundle bundle;
private static Handler handler;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_course_unfinished, container, false);
initView(view);
return view;
}
/**
*
* @param str
* @param appCompatActivity
* @return
*/
public static CrsUnfinishedListFragment newInstance(String str, AppCompatActivity appCompatActivity){
CrsUnfinishedListFragment unfinishedFra = new CrsUnfinishedListFragment();
mAppCompatActivity = appCompatActivity;
return unfinishedFra;
}
/**
*
* @param view
*/
private void initView(View view) {
lvUnfinishedCourseList = view.findViewById(R.id.lv_unfinished_course_list);
srlMyRefresh = view.findViewById(R.id.srl_my_refresh);
srlMyRefresh.setColorSchemeColors(Color.parseColor("#ff0000"),Color.parseColor("#00ff00"));
refreshData();
}
/**
*
*/
public static void refreshData(){
coursesData = new ArrayList<>();
adapter = new TeaDeleteCourseAdapter(
mAppCompatActivity,
R.layout.card_course_tea,
coursesData,
0
);
LinearLayoutManager llm = new LinearLayoutManager(mAppCompatActivity);
lvUnfinishedCourseList.setLayoutManager(llm);
lvUnfinishedCourseList.setAdapter(adapter);
bundle = mAppCompatActivity.getIntent().getExtras();
handler = new Handler(Looper.getMainLooper()){
@SuppressLint("NotifyDataSetChanged")
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
CourseData courseData = (CourseData) msg.obj;
coursesData.addAll(courseData.getRecords());
adapter.notifyDataSetChanged();
System.out.println("size == " + adapter.getItemCount() + "................................");
}
};
getUnfinishedCourseList();
setListener();
}
/**
*
*/
public static void setListener(){
adapter.setOnItemClickListener(new onRecyclerViewItemClickListener() {
@Override
public void onItemClick(RecyclerView parent, View view, int position) {
Intent intent = new Intent(mAppCompatActivity, CourseDetail.class);
bundle = mAppCompatActivity.getIntent().getExtras();
//将position传入bundle
Long courseId = coursesData.get(position).getmCourseId();
bundle.putLong(ModelFieldConstants.COURSE_ID, courseId);
System.out.println("courseId == " + courseId);
System.out.println("course == " + coursesData.get(position));
System.out.println("bundle:courseId == " + bundle.getLong(ModelFieldConstants.COURSE_ID));
System.out.println("bundle:userId == " + bundle.getLong(ModelFieldConstants.USER_ID));
intent.putExtras(bundle);
mAppCompatActivity.startActivity(intent);
}
@Override
public void onItemLongClick(RecyclerView parent, View view, int position) { }
});
srlMyRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
refreshData();
srlMyRefresh.setRefreshing(false);
}
});
}
private static void getUnfinishedCourseList(){
new Thread(new Runnable() {
final String urlParam = ModelFieldConstants.USER_ID + "=" + bundle.getLong(ModelFieldConstants.ID);
final String url = UrlConstants.TEACHER_UNFINISHED + "?" + urlParam;
@Override
public void run() {
new GetUrlParamHttpUtils() {
@Override
public void nextMethod(BaseResponse<Object> baseResponse) {
System.out.println("courseDataBaseResponse.getData() = " + baseResponse.getData() + "...............");
//解析数据
Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
Object obj = baseResponse.getData();
LinkedTreeMap<String, String> courseDataMap = null;
if(obj instanceof LinkedTreeMap){
courseDataMap = (LinkedTreeMap<String, String>) obj;
}
//将LinkedTreeMap中字段映射到CourseData类中
String jsonString = gson.toJson(courseDataMap);
CourseData<Course> courseData = gson.fromJson(jsonString, new TypeToken<CourseData<Course>>() {}.getType());
System.out.println("courseData = " + courseData);
if(courseData != null){
Message message = new Message();
message.obj = courseData;
handler.sendMessage(message);
}else{
System.out.println("courseData: null " + "...............................");
}
}
@Override
public void failedMethod(BaseResponse<Object> baseResponse) {
}
}.getConnect(url);
}
}).start();
}
}

@ -0,0 +1,78 @@
package com.example.stlink.fragments;
import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
import com.example.stlink.R;
import com.example.stlink.configs.adapter.TeaDeleteCourseAdapter;
import com.example.stlink.model.domain.Course;
import java.util.List;
public class DidNotSignListFragment extends Fragment {
private static RecyclerView rvCourseList;
private static List<Course> coursesData;
private static TeaDeleteCourseAdapter adapter;
private static AppCompatActivity mAppCompatActivity;
private int mPage = 1;
private int mCurrentColIndex = 0;
private static Bundle bundle;
private static Handler handler;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_sign_list, container, false);
initView(view);
return view;
}
/**
*
* @param str
* @param appCompatActivity
* @return
*/
public static DidNotSignListFragment newInstance(String str, AppCompatActivity appCompatActivity){
DidNotSignListFragment didNotSignListFragment = new DidNotSignListFragment();
mAppCompatActivity = appCompatActivity;
return didNotSignListFragment;
}
/**
*
* @param view
*/
private void initView(View view) {
rvCourseList = view.findViewById(R.id.rv_course_list);
refreshData();
}
/**
*
*/
public static void refreshData(){
getSignedList();
}
private static void getSignedList(){
}
}

@ -0,0 +1,78 @@
package com.example.stlink.fragments;
import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
import com.example.stlink.R;
import com.example.stlink.configs.adapter.TeaDeleteCourseAdapter;
import com.example.stlink.model.domain.Course;
import java.util.List;
public class LeaveListFragment extends Fragment {
private static RecyclerView rvCourseList;
private static List<Course> coursesData;
private static TeaDeleteCourseAdapter adapter;
private static AppCompatActivity mAppCompatActivity;
private int mPage = 1;
private int mCurrentColIndex = 0;
private static Bundle bundle;
private static Handler handler;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_sign_list, container, false);
initView(view);
return view;
}
/**
*
* @param str
* @param appCompatActivity
* @return
*/
public static LeaveListFragment newInstance(String str, AppCompatActivity appCompatActivity){
LeaveListFragment leaveListFragment = new LeaveListFragment();
mAppCompatActivity = appCompatActivity;
return leaveListFragment;
}
/**
*
* @param view
*/
private void initView(View view) {
rvCourseList = view.findViewById(R.id.rv_course_list);
refreshData();
}
/**
*
*/
public static void refreshData(){
getSignedList();
}
private static void getSignedList(){
}
}

@ -0,0 +1,78 @@
package com.example.stlink.fragments;
import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
import com.example.stlink.R;
import com.example.stlink.configs.adapter.TeaDeleteCourseAdapter;
import com.example.stlink.model.domain.Course;
import java.util.List;
public class SignListFragment extends Fragment {
private static RecyclerView rvCourseList;
private static List<Course> coursesData;
private static TeaDeleteCourseAdapter adapter;
private static AppCompatActivity mAppCompatActivity;
private int mPage = 1;
private int mCurrentColIndex = 0;
private static Bundle bundle;
private static Handler handler;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_sign_list, container, false);
initView(view);
return view;
}
/**
*
* @param str
* @param appCompatActivity
* @return
*/
public static SignListFragment newInstance(String str, AppCompatActivity appCompatActivity){
SignListFragment signListFragment = new SignListFragment();
mAppCompatActivity = appCompatActivity;
return signListFragment;
}
/**
*
* @param view
*/
private void initView(View view) {
rvCourseList = view.findViewById(R.id.rv_course_list);
refreshData();
}
/**
*
*/
public static void refreshData(){
getSignedList();
}
private static void getSignedList(){
}
}

@ -0,0 +1,239 @@
package com.example.stlink.fragments;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.example.stlink.R;
import com.example.stlink.activitys.fragmentChild.activityStuClassList.CourseSignIn;
import com.example.stlink.configs.adapter.StuClassListFragAdapter;
import com.example.stlink.configs.onRecyclerViewItemClickListener;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.model.constants.UrlConstants;
import com.example.stlink.model.domain.Course;
import com.example.stlink.model.domain.CourseSign;
import com.example.stlink.model.response.BaseResponse;
import com.example.stlink.model.response.data.CourseData;
import com.example.stlink.utils.httpUtils.GetUrlParamHttpUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.internal.LinkedTreeMap;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
import java.util.List;
public class StuClassListFragment extends Fragment {
private static RecyclerView rvStuCourseMsg;
private static List<CourseSign> courseSigns;
private static List<Long> courseIdList;
private static StuClassListFragAdapter adapter;
private static AppCompatActivity mAppCompatActivity;
private static SwipeRefreshLayout srlMyRefresh;
private int currentPage = 1;
private int size = 10;
private static Bundle bundle;
private static Handler handler;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_stu_class_msg, container, false);
initView(view);
return view;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public static StuClassListFragment newInstance(String str, AppCompatActivity appCompatActivity){
mAppCompatActivity = appCompatActivity;
StuClassListFragment frag = new StuClassListFragment();
return frag;
}
private void initView(View view){
rvStuCourseMsg = view.findViewById(R.id.rv_stu_course_msg);
srlMyRefresh = view.findViewById(R.id.srl_my_refresh);
srlMyRefresh.setColorSchemeColors(Color.parseColor("#ff0000"),Color.parseColor("#00ff00"));
refreshData();
}
public static void refreshData(){
courseIdList = new ArrayList<>();
courseSigns = new ArrayList<>();
adapter = new StuClassListFragAdapter(
mAppCompatActivity,
R.layout.card_class_unsigned_msg,
courseSigns,
0
);
LinearLayoutManager llm = new LinearLayoutManager(mAppCompatActivity);
rvStuCourseMsg.setLayoutManager(llm);
rvStuCourseMsg.setAdapter(adapter);
bundle = mAppCompatActivity.getIntent().getExtras();
getStuSelectedCourseList();
//只有在获取当前学生所选课程的所有id之后才能遍历
handler = new Handler(new Handler.Callback() {
@SuppressLint("NotifyDataSetChanged")
@Override
public boolean handleMessage(@NonNull Message msg) {
if(msg.arg1 == 100){
getToBeSignList();
setListener();
}else if(msg.arg1 == 200){
adapter.notifyDataSetChanged();
System.out.println("StuClassListFragment:courseSigns = " + courseSigns.toString());
}
return false;
}
});
}
/**
* item
*/
private static void setListener(){
adapter.setOnItemClickListener(new onRecyclerViewItemClickListener() {
@Override
public void onItemClick(RecyclerView parent, View view, int position) {
CourseSign courseSign = courseSigns.get(position);
bundle.putSerializable(ModelFieldConstants.COURSE_SIGN, courseSign);
Intent intent = new Intent(mAppCompatActivity, CourseSignIn.class);
intent.putExtras(bundle);
mAppCompatActivity.startActivity(intent);
}
@Override
public void onItemLongClick(RecyclerView parent, View view, int position) {
}
});
srlMyRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
refreshData();
srlMyRefresh.setRefreshing(false);
}
});
}
/**
*
*/
private static void getStuSelectedCourseList(){
new Thread(new Runnable() {
final String urlParam = ModelFieldConstants.USER_ID + "=" + bundle.getLong(ModelFieldConstants.ID);
final String url = UrlConstants.STUDENT_COURSE + "?" + urlParam;
@Override
public void run() {
new GetUrlParamHttpUtils() {
@Override
public void nextMethod(BaseResponse<Object> baseResponse) {
System.out.println("StuClassListFragment:baseResponse : " + baseResponse);
//解析数据
Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
Object obj = baseResponse.getData();
LinkedTreeMap<String, String> courseDataMap = null;
if(obj instanceof LinkedTreeMap){
courseDataMap = (LinkedTreeMap<String, String>) obj;
}
//将LinkedTreeMap中字段映射到CourseData类中
String jsonString = gson.toJson(courseDataMap);
CourseData<Course> courseData = gson.fromJson(jsonString, new TypeToken<CourseData<Course>>() {}.getType());
List<Course> records = courseData.getRecords();
for(Course course : records){
courseIdList.add(course.getmCourseId());
}
Message message = new Message();
message.arg1 = 100;
handler.sendMessage(message);
}
@Override
public void failedMethod(BaseResponse<Object> baseResponse) { }
}.getConnect(url);
}
}).start();
}
/**
*
*/
private static void getToBeSignList(){
new Thread(new Runnable() {
@Override
public void run() {
for(Long courseId : courseIdList){
String urlParam = ModelFieldConstants.COURSE_ID + "=" + courseId + "&" +
ModelFieldConstants.USER_ID + "=" + bundle.getLong(ModelFieldConstants.ID) + "&" +
ModelFieldConstants.COURSE_SIGN_STATUS + "=" + 0;
String url = UrlConstants.STUDENT_SIGN_LIST + "?" + urlParam;
new GetUrlParamHttpUtils() {
@Override
public void nextMethod(BaseResponse<Object> baseResponse) {
if(baseResponse.getData() != null){
System.out.println("StuClassListFragment:courseDataBaseResponse.getData() = " + baseResponse.getData() + "...............");
//解析数据
Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
Object obj = baseResponse.getData();
LinkedTreeMap<String, String> courseDataMap = null;
if(obj instanceof LinkedTreeMap){
courseDataMap = (LinkedTreeMap<String, String>) obj;
}
//将LinkedTreeMap中字段映射到CourseData类中
//array:学生获取所选课程签到列表返回实体
String jsonString = gson.toJson(courseDataMap);
CourseData<CourseSign> courseData = gson.fromJson(jsonString, new TypeToken<CourseData<CourseSign>>() {}.getType());
for(CourseSign courseSign : courseData.getRecords()){
courseSign.setCourseId(courseId);
}
if(courseData.getRecords().size() != 0){
courseSigns.addAll(courseData.getRecords());
System.out.println("Here......................");
Message message = new Message();
message.arg1 = 200;
handler.sendMessage(message);
}
}
}
@Override
public void failedMethod(BaseResponse<Object> baseResponse) { }
}.getConnect(url);
}
}
}).start();
}
}

@ -0,0 +1,244 @@
package com.example.stlink.fragments;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatButton;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.example.stlink.R;
import com.example.stlink.configs.adapter.StuDeleteCourseAdapter;
import com.example.stlink.configs.onRecyclerViewItemClickListener;
import com.example.stlink.activitys.fragmentChild.activityStuHome.AllCourses;
import com.example.stlink.activitys.fragmentChild.activityTeaCourse.CourseDetail;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.model.constants.UrlConstants;
import com.example.stlink.model.domain.Course;
import com.example.stlink.model.response.BaseResponse;
import com.example.stlink.model.response.data.CourseData;
import com.example.stlink.utils.httpUtils.GetUrlParamHttpUtils;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.internal.LinkedTreeMap;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
import java.util.List;
import gdut.bsx.view.FloatDragPopupWindow;
public class StuHomeFragment extends Fragment {
private static FloatingActionButton faButton;
private static AppCompatButton codeButton;
private static AppCompatButton wordButton;
private static RecyclerView rvStuCourseList;
private static ConstraintLayout clFragStuHome;
private static SwipeRefreshLayout srlMyRefresh;
private static AppCompatActivity mAppCompatActivity;
private static List<Course> courseList;
private static StuDeleteCourseAdapter adapter;
private static Bundle bundle;
private static Handler handler;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_stu_home, container, false);
mAppCompatActivity = (AppCompatActivity) getActivity();
initView(view);
return view;
}
public static StuHomeFragment newInstance(String str){
StuHomeFragment frag = new StuHomeFragment();
return frag;
}
/**
*
* @param view
*/
private static void initView(View view){
codeButton = view.findViewById(R.id.bt_code_check);
wordButton = view.findViewById(R.id.bt_word_check);
faButton = view.findViewById(R.id.floating_action_button);
rvStuCourseList = view.findViewById(R.id.rv_stu_course_list);
clFragStuHome = view.findViewById(R.id.cl_frag_stu_home);
srlMyRefresh = view.findViewById(R.id.srl_my_refresh);
srlMyRefresh.setColorSchemeColors(Color.parseColor("#ff0000"),Color.parseColor("#00ff00"));
//先把父布局里的该按钮给移除
clFragStuHome.removeView(faButton);
// 创建 FloatDragPopupWindow并将 contentView 添加到布局中
FloatDragPopupWindow floatDragPopupWindow = new FloatDragPopupWindow.Builder(mAppCompatActivity)
.setContentView(faButton)
.setPosition(0, 600)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mAppCompatActivity, AllCourses.class);
intent.putExtras(mAppCompatActivity.getIntent().getExtras());
mAppCompatActivity.startActivity(intent);
}
})
.build();
// 显示 FloatDragPopupWindow
floatDragPopupWindow.show();
setListener(view);
refreshData();
}
/**
*
* @param view
*/
private static void setListener(View view){
//口令输入 TODO
codeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
//文本输入 TODO
wordButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
faButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
srlMyRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
refreshData();
srlMyRefresh.setRefreshing(false);
}
});
}
/**
*
*/
public static void refreshData(){
courseList = new ArrayList<>();
adapter = new StuDeleteCourseAdapter(
mAppCompatActivity,
R.layout.card_course_tea,
courseList,
0
);
LinearLayoutManager llm = new LinearLayoutManager(mAppCompatActivity);
rvStuCourseList.setLayoutManager(llm);
rvStuCourseList.setAdapter(adapter);
bundle = mAppCompatActivity.getIntent().getExtras();
handler = new Handler(Looper.getMainLooper()){
@SuppressLint("NotifyDataSetChanged")
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if(msg.arg1 == 100){
System.out.println("courseList = " + courseList.toString());
adapter.notifyDataSetChanged();
}
}
};
getStuSelectedCourseList();
setItemClickListener();
}
/**
*
*/
public static void setItemClickListener(){
adapter.setOnItemClickListener(new onRecyclerViewItemClickListener() {
@Override
public void onItemClick(RecyclerView parent, View view, int position) {
Intent intent = new Intent(mAppCompatActivity, CourseDetail.class);
bundle = mAppCompatActivity.getIntent().getExtras();
//将position传入bundle
Long courseId = courseList.get(position).getmCourseId();
bundle.putLong(ModelFieldConstants.COURSE_ID, courseId);
System.out.println("courseId == " + courseId);
System.out.println("course == " + courseList.get(position));
System.out.println("bundle:courseId == " + bundle.getLong(ModelFieldConstants.COURSE_ID));
System.out.println("bundle:userId == " + bundle.getLong(ModelFieldConstants.USER_ID));
intent.putExtras(bundle);
mAppCompatActivity.startActivity(intent);
}
@Override
public void onItemLongClick(RecyclerView parent, View view, int position) { }
});
}
private static void getStuSelectedCourseList(){
new Thread(new Runnable() {
final String urlParam = ModelFieldConstants.USER_ID + "=" + bundle.getLong(ModelFieldConstants.ID);
final String url = UrlConstants.STUDENT_COURSE + "?" + urlParam;
@Override
public void run() {
new GetUrlParamHttpUtils() {
@Override
public void nextMethod(BaseResponse<Object> baseResponse) {
//解析数据
Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
Object obj = baseResponse.getData();
LinkedTreeMap<String, String> courseDataMap = null;
if(obj instanceof LinkedTreeMap){
courseDataMap = (LinkedTreeMap<String, String>) obj;
}
//将LinkedTreeMap中字段映射到CourseData类中
String jsonString = gson.toJson(courseDataMap);
CourseData<Course> courseData = gson.fromJson(jsonString, new TypeToken<CourseData<Course>>() {}.getType());
List<Course> records = courseData.getRecords();
courseList.addAll(records);
Message message = new Message();
message.arg1 = 100;
handler.sendMessage(message);
}
@Override
public void failedMethod(BaseResponse<Object> baseResponse) { }
}.getConnect(url);
}
}).start();
}
}

@ -0,0 +1,110 @@
package com.example.stlink.fragments;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.widget.ViewPager2;
import com.example.stlink.R;
import com.example.stlink.utils.activityUtil.TeaClassListUtil;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.ArrayList;
import java.util.List;
public class TeaCourseListFragment extends Fragment {
private static TeaClassListUtil teaClassListUtil;
private static FloatingActionButton ftBtRefresh;
private static AppCompatActivity mAppCompatActivity;
private static ViewPager2 viewPager2;
private static ActivityResultLauncher<Intent> intentActivityResultLauncher;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_tea_course_list, container, false);
initView(view);
initPage();
return view;
}
public static TeaCourseListFragment newInstance(String str, AppCompatActivity appCompatActivity){
TeaCourseListFragment frag = new TeaCourseListFragment();
mAppCompatActivity = appCompatActivity;
intentActivityResultLauncher = appCompatActivity.registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
Intent data = result.getData();
int resultCode = result.getResultCode();
System.out.println("registerForActivityResult...........................");
if (resultCode == Activity.RESULT_OK) {
}
});
return frag;
}
/**
*
*/
@SuppressLint("UseCompatLoadingForDrawables")
private void initView(View view){
teaClassListUtil = new TeaClassListUtil(view, mAppCompatActivity);
ftBtRefresh = view.findViewById(R.id.ft_bt_refresh);
viewPager2 = view.findViewById(R.id.nav_course_list_fragment);
refreshData();
setClickListener();
}
private static void initPage(){
List<Fragment> list = new ArrayList<>();
CrsUnfinishedListFragment crsUnfinishedListFragment = CrsUnfinishedListFragment.newInstance("未结课", mAppCompatActivity);
CrsFinishedListFragment crsFinishedListFragment = CrsFinishedListFragment.newInstance("已结课", mAppCompatActivity);
list.add(crsUnfinishedListFragment);
list.add(crsFinishedListFragment);
teaClassListUtil.initPage(list);
}
/**
*
*/
private void refreshData(){
}
/**
*
*/
private void setClickListener(){
//点击刷新页面
ftBtRefresh.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = viewPager2.getCurrentItem();
if (position == 0){
CrsUnfinishedListFragment.refreshData();
}else{
CrsFinishedListFragment.refreshData();
}
}
});
}
}

@ -0,0 +1,143 @@
package com.example.stlink.fragments;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.widget.ViewPager2;
import com.example.stlink.R;
import com.example.stlink.activitys.fragmentChild.activityTeaHome.CheckCourseSign;
import com.example.stlink.activitys.fragmentChild.activityTeaHome.ChooseCourse;
import com.example.stlink.activitys.fragmentChild.activityTeaHome.CreateCourse;
import com.example.stlink.activitys.fragmentChild.activityTeaHome.CreateSign;
import com.example.stlink.model.constants.ModelFieldConstants;
public class TeaHomeFragment extends Fragment{
private Button btCodeCheck;
private Button btWordCheck;
private Button btCreateClass;
private Button btManageClass;
private static ViewPager2 vp2;
private Bundle bundle;
private static ActivityResultLauncher<Intent> intentActivityResultLauncher;
private static AppCompatActivity mAppCompatActivity;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_tea_home, container, false);
initView(view);
return view;
}
public static TeaHomeFragment newInstance(String str, AppCompatActivity appCompatActivity, ViewPager2 viewPager2){
mAppCompatActivity = appCompatActivity;
TeaHomeFragment frag = new TeaHomeFragment();
vp2 = viewPager2;
intentActivityResultLauncher = appCompatActivity.registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
Intent data = result.getData();
int resultCode = result.getResultCode();
System.out.println("registerForActivityResult...........................");
if (resultCode == Activity.RESULT_OK) {
//将活动销毁返回的数据刷新到当前活动,同时刷新当前布局
refreshData();
}else if (resultCode == 100){
assert data != null;
mAppCompatActivity.getIntent().putExtras(data.getExtras());
Intent intent = new Intent(mAppCompatActivity, CheckCourseSign.class);
intent.putExtras(mAppCompatActivity.getIntent().getExtras());
mAppCompatActivity.startActivity(intent);
}
});
return frag;
}
/**
*
*/
private void initView(View view){
btCodeCheck = view.findViewById(R.id.bt_code_check);
btWordCheck = view.findViewById(R.id.bt_word_check);
btCreateClass = view.findViewById(R.id.bt_create_class);
btManageClass = view.findViewById(R.id.bt_manage_class);
setClickListener();
}
private static void refreshData(){
}
/**
*
*/
private void setClickListener(){
//查看签到
btCodeCheck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bundle = mAppCompatActivity.getIntent().getExtras();
String nowSignCourseName = bundle.getString(ModelFieldConstants.NOW_SIGN_COURSE_NAME);
if(nowSignCourseName != null){
System.out.println("nowSignCourseName = " + nowSignCourseName + "......................");
Intent intent = new Intent(mAppCompatActivity, CheckCourseSign.class);
intent.putExtras(mAppCompatActivity.getIntent().getExtras());
startActivity(intent);
}else{
Intent intent = new Intent(mAppCompatActivity, ChooseCourse.class);
bundle.putInt(ModelFieldConstants.COURSE_CHOOSE_SELECT, 1);
intent.putExtras(bundle);
startActivity(intent);
}
}
});
//创建签到
btWordCheck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mAppCompatActivity, CreateSign.class);
bundle = mAppCompatActivity.getIntent().getExtras();
bundle.putInt(ModelFieldConstants.COURSE_CHOOSE_SELECT, 0);
intent.putExtras(bundle);
intentActivityResultLauncher.launch(intent);
}
});
//创建班级
btCreateClass.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mAppCompatActivity, CreateCourse.class);
intent.putExtras(mAppCompatActivity.getIntent().getExtras());
intentActivityResultLauncher.launch(intent);
}
});
//管理班级
btManageClass.setOnClickListener(new View.OnClickListener() {
@SuppressLint("ResourceType")
@Override
public void onClick(View v) {
vp2.setCurrentItem(1);
}
});
}
}

@ -0,0 +1,230 @@
package com.example.stlink.fragments;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.content.FileProvider;
import androidx.fragment.app.Fragment;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import com.example.stlink.BuildConfig;
import com.example.stlink.R;
import com.example.stlink.activitys.fragmentChild.activityUserInfo.UserInfoAbout;
import com.example.stlink.activitys.fragmentChild.activityUserInfo.UserInfoDetail;
import com.example.stlink.activitys.fragmentChild.activityUserInfo.UserInfoRecord;
import com.example.stlink.activitys.fragmentChild.activityUserInfo.UserInfoSetting;
import com.example.stlink.model.constants.ModelFieldConstants;
import com.example.stlink.utils.MySQLiteDAO;
import java.io.File;
import java.util.List;
public class UserInfoFragment extends Fragment {
private static Button btSetting;
private static Button btAbout;
private static Button btShare;
private static Button btRecord;
private static ConstraintLayout clBaseInfo;
private static ImageView ivHeadImg;
private static TextView tvUserName;
private static TextView tvSchool;
private static AppCompatActivity mAppCompatActivity;
private static ActivityResultLauncher<Intent> intentActivityResultLauncher;
private static Handler shareHandler;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_user_my_info, container, false);
initView(view);
return view;
}
/**
* UserInfoFragment
* @param str
* @return UserInfoFragment
*/
public static UserInfoFragment newInstance(String str, AppCompatActivity appCompatActivity){
UserInfoFragment frag = new UserInfoFragment();
mAppCompatActivity = appCompatActivity;
intentActivityResultLauncher = mAppCompatActivity.registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
Intent data = result.getData();
int resultCode = result.getResultCode();
System.out.println("registerForActivityResult...........................");
if (resultCode == Activity.RESULT_OK) {
assert data != null;
mAppCompatActivity.getIntent().putExtras(data.getExtras());
refreshData();
}
});
return frag;
}
public static void initView(View view){
btSetting = view.findViewById(R.id.bt_setting);
btAbout = view.findViewById(R.id.bt_about);
btShare = view.findViewById(R.id.bt_share);
btRecord = view.findViewById(R.id.bt_record);
clBaseInfo = view.findViewById(R.id.base_info);
ivHeadImg = view.findViewById(R.id.iv_head_img);
tvUserName = view.findViewById(R.id.tv_user_name);
tvSchool = view.findViewById(R.id.tv_school);
MySQLiteDAO mySQLiteDAO = MySQLiteDAO.newInstance();
refreshData();
initOnClickListener();
}
public static void refreshData(){
Bundle bundle = mAppCompatActivity.getIntent().getExtras();
Integer roleId = (Integer) bundle.get(ModelFieldConstants.ROLE_ID);
String userName = (String) bundle.get(ModelFieldConstants.USER_NAME);
String avatar = (String) bundle.get(ModelFieldConstants.AVATAR);
String schoolName = (String) bundle.get(ModelFieldConstants.COLLEGE_NAME);
if(roleId == 0){
ivHeadImg.setImageResource(R.mipmap.student);
}
if(avatar != null){
Glide.with(mAppCompatActivity)
.load(avatar)
//添加圆角
.apply(new RequestOptions().bitmapTransform(new RoundedCorners(10)))
.into(ivHeadImg);
}
if(userName != null){
tvUserName.setText(userName);
}
if(schoolName != null){
tvSchool.setText(schoolName);
}
}
public static void initOnClickListener(){
btSetting.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mAppCompatActivity, UserInfoSetting.class);
intent.putExtras(mAppCompatActivity.getIntent().getExtras());
intentActivityResultLauncher.launch(intent);
}
});
//关于
btAbout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mAppCompatActivity, UserInfoAbout.class);
intent.putExtras(mAppCompatActivity.getIntent().getExtras());
intentActivityResultLauncher.launch(intent);
}
});
//分享
btShare.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
shareHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
if(msg.arg1 == 1){
Intent shareIntent = (Intent) msg.obj;
intentActivityResultLauncher.launch(Intent.createChooser(shareIntent, "分享apk"));
}
return false;
}
});
shareApk();
}
});
btRecord.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mAppCompatActivity, UserInfoRecord.class);
intent.putExtras(mAppCompatActivity.getIntent().getExtras());
intentActivityResultLauncher.launch(intent);
}
});
clBaseInfo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mAppCompatActivity, UserInfoDetail.class);
intent.putExtras(mAppCompatActivity.getIntent().getExtras());
intentActivityResultLauncher.launch(intent);
}
});
}
private static void shareApk(){
new Thread(new Runnable() {
@Override
public void run() {
PackageManager mPackageManager = mAppCompatActivity.getPackageManager();
List<PackageInfo> packageInfoList = mPackageManager.getInstalledPackages(0);
System.out.println("UserInfoFragment:PackageInfo : " + packageInfoList);
try {
ApplicationInfo applicationInfo = mPackageManager.getApplicationInfo("com.example.stlink", 0);
File apkFile = new File(applicationInfo.sourceDir);
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
// // 比如发送文本形式的数据内容
// // 指定发送的内容
// shareIntent.putExtra(Intent.EXTRA_TEXT, "S.T.Link......");
// // 指定发送内容的类型
// shareIntent.setType("text/plain");
//
// intentActivityResultLauncher.launch(Intent.createChooser(shareIntent, "分享"));
shareIntent.setType("*/*");
// 给目标应用一个临时的读授权如果要写权限则是FLAG_GRANT_WRITE_URI_PERMISSION
shareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
// 第二个参数就是AndroidManifest中配置的authorities即包名.fileProvider
Uri contentUri = FileProvider.getUriForFile(mAppCompatActivity, BuildConfig.APPLICATION_ID + ".fileProvider", apkFile);
shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
Message message = new Message();
message.arg1 = 1;
message.obj = shareIntent;
shareHandler.sendMessage(message);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
}).start();
}
}

@ -0,0 +1,83 @@
package com.example.stlink.model.constants;
public class ModelFieldConstants {
private ModelFieldConstants(){}
/*==================================================================================================*/
// 主键ID
public static final String ID = "id";
// 角色id 0学生 1教师
public static final String ROLE_ID = "roleId";
// 学/工号
public static final String ID_NUMBER = "idNumber";
// 真实姓名
public static final String REAL_NAME = "realName";
// 用户名
public static final String USER_NAME = "userName";
//密码
public static final String PASSWORD = "password";
//院校名
public static final String COLLEGE_NAME = "collegeName";
// 性别, true:男 false:女 默认为男
public static final String GENDER = "gender";
// 头像
public static final String AVATAR = "avatar";
//邮箱
public static final String EMAIL = "email";
//手机号
public static final String PHONE = "phone";
//入学时间
public static final String IN_SCHOOL_TIME = "inSchoolTime";
//创建时间
public static final String CREATE_TIME = "createTime";
/*==================================================================================================*/
//待修改字段
public static final String TO_BE_MODIFY = "toBeModify";
/*==================================================================================================*/
//文件上传key
public static final String FILE = "file";
/*==================================================================================================*/
//课程id
public static final String COURSE_ID = "courseId";
//课程名
public static final String COURSE_NAME = "courseName";
//课程图片
public static final String COURSE_PHOTO = "coursePhoto";
//结束时间
public static final String END_TIME = "endTime";
//课程介绍
public static final String INTRODUCE = "introduce";
//开始时间
public static final String START_TIME = "startTime";
/*==================================================================================================*/
//当前登录用户主键id
public static final String USER_ID = "userId";
//当前页
public static final String CURRENT = "current";
//页面大小
public static final String SIZE = "size";
/*==================================================================================================*/
//选择的课程的position
public static final String COURSE_POSITION = "position";
//序列化课程
public static final String COURSE_DETAIL_DATA = "courseDetailData";
//经纬度
public static final String LatLon = "latLon";
//当前签到课程名字
public static final String NOW_SIGN_COURSE_NAME = "nowSignCourseName";
//当前签到课程id
public static final String NOW_SIGN_COURSE_ID = "nowSignCourseId";
//签到状态0未签 1已签[默认为0表示未签]
public static final String COURSE_SIGN_STATUS = "status";
//教师主页课程选择, 0创建签到 1查看签到
public static final String COURSE_CHOOSE_SELECT = "courseChooseSelect";
//序列化课程签到
public static final String COURSE_SIGN = "courseSign";
//地点
public static final String LOCATION = "location";
/*==================================================================================================*/
}

@ -0,0 +1,35 @@
package com.example.stlink.model.constants;
import com.example.stlink.model.contract.UserInfoContract;
/**
* SQLiteSQL
*/
public final class SQLiteConstants {
/*==================================================================================================*/
public static final String USER_INFO_SQL_CREATE_ENTRIES =
"CREATE TABLE IF NOT EXISTS " + UserInfoContract.UserEntry.TABLE_NAME + " ( " +
UserInfoContract.UserEntry._ID + " INTEGER PRIMARY KEY, " +
UserInfoContract.UserEntry.COLUMN_NAME_APP_KEY + " VARCHAR(256), " +
UserInfoContract.UserEntry.COLUMN_NAME_AVATAR + " VARCHAR(256), " +
UserInfoContract.UserEntry.COLUMN_NAME_COLLEGE_NAME + " VARCHAR(256), " +
UserInfoContract.UserEntry.COLUMN_NAME_CREATE_TIME + " INTEGER, " +
UserInfoContract.UserEntry.COLUMN_NAME_EMAIL + " VARCHAR(256), " +
UserInfoContract.UserEntry.COLUMN_NAME_GENDER + " INTEGER, " +
UserInfoContract.UserEntry.COLUMN_NAME_ID + " INTEGER, " +
UserInfoContract.UserEntry.COLUMN_NAME_ID_NUMBER + " INTEGER, " +
UserInfoContract.UserEntry.COLUMN_NAME_IN_SCHOOL_TIME + " INTEGER, " +
UserInfoContract.UserEntry.COLUMN_NAME_LAST_UPDATE_TIME + " INTEGER, " +
UserInfoContract.UserEntry.COLUMN_NAME_PHONE + " VARCHAR(256), " +
UserInfoContract.UserEntry.COLUMN_NAME_REAL_NAME + " VARCHAR(256), " +
UserInfoContract.UserEntry.COLUMN_NAME_ROLE_ID + " INTEGER, " +
UserInfoContract.UserEntry.COLUMN_NAME_USER_NAME + " VARCHAR(256) " +
")";
public static final String USER_INFO_SQL_DELETE_ENTRIES =
"DROP TABLE IF EXISTS " + UserInfoContract.UserEntry.TABLE_NAME;
public static final int DATABASE_FIRST_VERSION = 1;
public static final String USER_INFO_DATABASE_NAME = "userInfo.db";
/*==================================================================================================*/
}

@ -0,0 +1,96 @@
package com.example.stlink.model.constants;
import okhttp3.Credentials;
import okhttp3.MediaType;
/**
*
*/
public final class UrlConstants {
private UrlConstants(){}
/*==================================================================================================*/
//个人身份昵称
public static final String APP_USER_NAME = "helloWorld";
//个人身份密码
public static final String APP_PASSWORD = "HelloWorld,1234";
//网页登陆之后的token
public static final String TOKEN = "bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTQ2ODM3MTMsInVzZXJfbmFtZSI6IjUiLCJhdXRob3JpdGllcyI6WyJST0xFX1VTRVIiXSwianRpIjoiMjRhZmQ1MzUtN2EzNy00MjFkLWJiYmEtM2M5ZTQ1ZmIyYzRiIiwiY2xpZW50X2lkIjoiY29pbi1hcGkiLCJzY29wZSI6WyJhbGwiXX0.Hn5ZkEde27mGMkJpY9fOR40wSfI5BDCVRB4tU9AUMnI0jPKFUFkBRqkgcVtjG9HwYWAn-QwtqfpmBwBY5IAf_iIJpfwnXes5bBABUsOGgbNOtSGzTBMhcAtqU-NshuFdPdgBtNvOJkDLx7E2IP3xOPEDTBc9i1eu16IHfyYmRHCE3zRpo2qd1DdP0VuIa_D8JJ7WaEVqFOqS7e1QC7Jfm6eFKAfFPzct6alRiXpoEOq0WLVKdUbD_EjV7GsjT-tmOWGEtKvnZgmhu5Y_LrNhG-iv1lxlEZU3QyDCWs6pVLb03tZe-AIHJl6T-Avjp7uCec3aiOKXjcKgJEDTI-GqYw";
//身份。。。
public static final String CREDENTIAL = Credentials.basic(UrlConstants.APP_USER_NAME, UrlConstants.APP_PASSWORD);
//服务器前面公共的地址
public static final String SERVER_URL = "http://47.107.52.7:88/member/sign";
//服务器分配的应用ID
public static final String APP_ID = "f39a68c119c34771bfae34a59587ab4e";
//请求服务器时携带的密码
public static final String APP_SECRET = "60868270e85186e18489285b5c6e43d50c085";
//请求头参数
public static final String HEAD_PARAM = "?" + "&appId=" + UrlConstants.APP_ID
+ "&appSecret=" + UrlConstants.APP_SECRET;
// 每次请求结果多少
public static final Integer PAGE_SIZE = 10;
//媒体请求类型
public static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json; charset=utf-8");
//定义图片文件解析,下面的 * 代表的是要上传的图片的格式比如png、jpg、JPEG等等
public static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/*");
//身份校验
public static final String AUTHORIZATION = TOKEN;
/*==================================================================================================*/
public static final String IS_IMG_UPLOAD_SUCCESS = "isImgUploadSuccess";
/*==================================================================================================*/
//课程
public static final String COURSE = "/course";
//学生
public static final String STUDENT = "/student";
//教师
public static final String TEACHER = "/teacher";
//用户
public static final String USER = "/user";
//用户相关
public static final String USER_URL = SERVER_URL + USER;
//课程相关
public static final String COURSE_URL = SERVER_URL + COURSE;
//学生相关
public static final String STUDENT_URL = COURSE_URL + STUDENT;
//教师相关
public static final String TEACHER_URL = COURSE_URL + TEACHER;
/*--------------------------------------------------------------------------------------------------*/
// 用户注册
public static final String USER_REGISTER = USER_URL + "/register";
// 用户登录
public static final String USER_LOGIN = USER_URL + "/login";
// 修改用户个人信息
public static final String USER_UPDATE = USER_URL + "/update";
/*--------------------------------------------------------------------------------------------------*/
//上传图片
public static final String FILE_UPLOAD = SERVER_URL + "/image/upload";
/*--------------------------------------------------------------------------------------------------*/
// 分页获取全部课程列表
public static final String ALL_COURSE = COURSE_URL + "/all";
// 获取单个课程详情
public static final String COURSE_DETAIL = COURSE_URL + "/detail";
/*--------------------------------------------------------------------------------------------------*/
//学生用户获取自己所加入的课程
public static final String STUDENT_COURSE = STUDENT_URL;
//学生选课
public static final String STUDENT_SELECT = STUDENT_URL + "/select";
//学生退课
public static final String STUDENT_DROP = STUDENT_URL + "/drop";
//学生签到
public static final String STUDENT_SIGN = STUDENT_URL + "/sign";
//学生用户获取所选课程中的签到列表
public static final String STUDENT_SIGN_LIST = STUDENT_URL + "/signList";
/*--------------------------------------------------------------------------------------------------*/
// 教师添加课程POST & 教师删除课程DELETE
public static final String TEACHER_COURSE = TEACHER_URL;
//查看当前教师用户的已经结课的课程列表
public static final String TEACHER_FINISHED = TEACHER_URL + "/finished";
//查看当前教师用户的未结课的课程列表
public static final String TEACHER_UNFINISHED = TEACHER_URL + "/unfinished";
//教师端发起签到
public static final String TEACHER_INITIATE = TEACHER_URL + "/initiate";
//教师获取签到界面数据信息
public static final String TEACHER_PAGE = TEACHER_URL + "/page";
/*==================================================================================================*/
}

@ -0,0 +1,28 @@
package com.example.stlink.model.contract;
import android.provider.BaseColumns;
/**
* User
*/
public final class UserInfoContract {
private UserInfoContract(){}
public static class UserEntry implements BaseColumns {
public static final String TABLE_NAME = "user_info";
public static final String COLUMN_NAME_APP_KEY = "appKey";
public static final String COLUMN_NAME_AVATAR = "avatar";
public static final String COLUMN_NAME_COLLEGE_NAME = "collegeName";
public static final String COLUMN_NAME_CREATE_TIME = "createTime";
public static final String COLUMN_NAME_EMAIL = "email";
public static final String COLUMN_NAME_GENDER = "gender";
public static final String COLUMN_NAME_ID = "id";
public static final String COLUMN_NAME_ID_NUMBER = "idNumber";
public static final String COLUMN_NAME_IN_SCHOOL_TIME = "inSchoolTime";
public static final String COLUMN_NAME_LAST_UPDATE_TIME = "lastUpdateTime";
public static final String COLUMN_NAME_PHONE = "phone";
public static final String COLUMN_NAME_REAL_NAME = "realName";
public static final String COLUMN_NAME_ROLE_ID = "roleId";
public static final String COLUMN_NAME_USER_NAME= "userName";
}
}

@ -0,0 +1,72 @@
package com.example.stlink.model.domain;
import com.google.gson.annotations.SerializedName;
public class Course {
/**
*
*/
@SerializedName("collegeName")
private String mCollegeName;
/**
*
*/
@SerializedName("courseId")
private Long mCourseId;
/**
*
*/
@SerializedName("courseName")
private String mCourseName;
/**
*
*/
@SerializedName("coursePhoto")
private String mCoursePhoto;
public String getmCollegeName() {
return mCollegeName;
}
public void setmCollegeName(String mCollegeName) {
this.mCollegeName = mCollegeName;
}
public Long getmCourseId() {
return mCourseId;
}
public void setmCourseId(Long mCourseId) {
this.mCourseId = mCourseId;
}
public String getmCourseName() {
return mCourseName;
}
public void setmCourseName(String mCourseName) {
this.mCourseName = mCourseName;
}
public String getmCoursePhoto() {
return mCoursePhoto;
}
public void setmCoursePhoto(String mCoursePhoto) {
this.mCoursePhoto = mCoursePhoto;
}
@Override
public String toString() {
return "Course{" +
"mCollegeName='" + mCollegeName + '\'' +
", mCourseId=" + mCourseId +
", mCourseName='" + mCourseName + '\'' +
", mCoursePhoto='" + mCoursePhoto + '\'' +
'}';
}
}

@ -0,0 +1,81 @@
package com.example.stlink.model.domain;
import java.io.Serializable;
public class CourseSign implements Serializable {
/**
*
*/
private String courseAddr;
/**
*
*/
private String courseName;
/**
* id
*/
private Long courseId;
/**
*
*/
private Long createTime;
/**
* id
*/
private Long userSignId;
public String getCourseAddr() {
return courseAddr;
}
public void setCourseAddr(String courseAddr) {
this.courseAddr = courseAddr;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public Long getCreateTime() {
return createTime;
}
public void setCreateTime(Long createTime) {
this.createTime = createTime;
}
public Long getUserSignId() {
return userSignId;
}
public void setUserSignId(Long userSignId) {
this.userSignId = userSignId;
}
public Long getCourseId() {
return courseId;
}
public void setCourseId(Long courseId) {
this.courseId = courseId;
}
@Override
public String toString() {
return "CourseSign{" +
"courseAddr='" + courseAddr + '\'' +
", courseName='" + courseName + '\'' +
", createTime=" + createTime +
", userSignId=" + userSignId +
'}';
}
}

@ -0,0 +1,182 @@
package com.example.stlink.model.domain;
import android.content.Intent;
import java.util.Date;
public class User {
//用户所创建应用的id
private String appKey;
//头像
private String avatar;
//院校名
private String collegeName;
//创建时间
private Long createTime;
//邮箱
private String email;
//性别
private Boolean gender;
//主键id
private Long id;
//学/工号
private Long idNumber;
//入学时间
private Long inSchoolTime;
//上次修改时间
private Long lastUpdateTime;
//手机号
private String phone;
//真实姓名
private String realName;
//角色【0学生1教师】
private Integer roleId;
//用户名
private String userName;
public String getAppKey() {
return appKey;
}
public void setAppKey(String appKey) {
this.appKey = appKey;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public String getCollegeName() {
return collegeName;
}
public void setCollegeName(String collegeName) {
this.collegeName = collegeName;
}
public Long getCreateTime() {
return createTime;
}
public void setCreateTime(Long createTime) {
this.createTime = createTime;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Boolean getGender() {
return gender;
}
public void setGender(Boolean gender) {
this.gender = gender;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getIdNumber() {
return idNumber;
}
public void setIdNumber(Long idNumber) {
this.idNumber = idNumber;
}
public Long getInSchoolTime() {
return inSchoolTime;
}
public void setInSchoolTime(Long inSchoolTime) {
this.inSchoolTime = inSchoolTime;
}
public Long getLastUpdateTime() {
return lastUpdateTime;
}
public void setLastUpdateTime(Long lastUpdateTime) {
this.lastUpdateTime = lastUpdateTime;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Override
public String toString() {
return "User{" +
"appKey='" + appKey + '\'' +
", avatar='" + avatar + '\'' +
", collegeName='" + collegeName + '\'' +
", createTime=" + createTime +
", email='" + email + '\'' +
", gender=" + gender +
", id=" + id +
", idNumber=" + idNumber +
", inSchoolTime=" + inSchoolTime +
", lastUpdateTime=" + lastUpdateTime +
", phone='" + phone + '\'' +
", realName='" + realName + '\'' +
", roleId=" + roleId +
", userName='" + userName + '\'' +
'}';
}
}

@ -0,0 +1,36 @@
package com.example.stlink.model.request;
import com.example.stlink.model.constants.UrlConstants;
public class AllCourseRequest {
private Integer current;
private Integer size;
public Integer getCurrent() {
return current;
}
public void setCurrent(Integer current) {
this.current = current;
}
public Integer getSize() {
return size;
}
public void setSize(Integer size) {
this.size = size;
}
@Override
public String toString() {
String retValue;
retValue = "?" + "&appId=" + UrlConstants.APP_ID
+ "&appSecret=" + UrlConstants.APP_SECRET
+ "&current" + current
+ "&size" + size;
return retValue;
}
}

@ -0,0 +1,141 @@
package com.example.stlink.model.request;
import com.google.gson.internal.bind.util.ISO8601Utils;
public class CourseCreateRequest {
/**
*
*/
private String collegeName;
/**
*
*/
private String courseName;
/**
*
*/
private String coursePhoto;
/**
* ()
*/
private Long endTime;
/**
*
*/
private String introduce;
/**
*
*
*/
private String realName;
/**
*
* ()
*/
private Long startTime;
/**
* id
*/
private Long userId;
/**
*
*
*/
private String userName;
public String getCollegeName() {
return collegeName;
}
public void setCollegeName(String collegeName) {
this.collegeName = collegeName;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public String getCoursePhoto() {
return coursePhoto;
}
public void setCoursePhoto(String coursePhoto) {
this.coursePhoto = coursePhoto;
}
public Long getEndTime() {
return endTime;
}
public void setEndTime(Long endTime) {
this.endTime = endTime;
}
public String getIntroduce() {
return introduce;
}
public void setIntroduce(String introduce) {
this.introduce = introduce;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public Long getStartTime() {
return startTime;
}
public void setStartTime(Long startTime) {
this.startTime = startTime;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Override
public String toString() {
return "CourseCreateRequest{" +
"collegeName='" + collegeName + '\'' +
", courseName='" + courseName + '\'' +
", coursePhoto='" + coursePhoto + '\'' +
", endTime=" + endTime +
", introduce='" + introduce + '\'' +
", realName='" + realName + '\'' +
", startTime=" + startTime +
", userId=" + userId +
", userName='" + userName + '\'' +
'}';
}
}

@ -0,0 +1,125 @@
package com.example.stlink.model.request;
/**
*
*/
public class CourseCreateSignRequest {
/**
* ()
*/
private Long beginTime;
/**
*
*/
private String courseAddr;
/**
* id
*/
private Long courseId;
/**
*
*/
private String courseName;
/**
*
*/
private Long endTime;
/**
*
*/
private Long signCode;
/**
*
*/
private Long total;
/**
* id
*/
private Long userId;
public Long getBeginTime() {
return beginTime;
}
public void setBeginTime(Long beginTime) {
this.beginTime = beginTime;
}
public String getCourseAddr() {
return courseAddr;
}
public void setCourseAddr(String courseAddr) {
this.courseAddr = courseAddr;
}
public Long getCourseId() {
return courseId;
}
public void setCourseId(Long courseId) {
this.courseId = courseId;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public Long getEndTime() {
return endTime;
}
public void setEndTime(Long endTime) {
this.endTime = endTime;
}
public Long getSignCode() {
return signCode;
}
public void setSignCode(Long signCode) {
this.signCode = signCode;
}
public Long getTotal() {
return total;
}
public void setTotal(Long total) {
this.total = total;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
@Override
public String toString() {
return "CourseCreateSignRequest{" +
"beginTime=" + beginTime +
", courseAddr='" + courseAddr + '\'' +
", courseId=" + courseId +
", courseName='" + courseName + '\'' +
", endTime=" + endTime +
", signCode=" + signCode +
", total=" + total +
", userId=" + userId +
'}';
}
}

@ -0,0 +1,54 @@
package com.example.stlink.model.request;
import android.content.Intent;
public class StuSignRequest {
/**
*
*/
private Integer signCode;
/**
* id
*/
private Long userId;
/**
* id
*/
private Long userSignId;
public Integer getSignCode() {
return signCode;
}
public void setSignCode(Integer signCode) {
this.signCode = signCode;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public Long getUserSignId() {
return userSignId;
}
public void setUserSignId(Long userSignId) {
this.userSignId = userSignId;
}
@Override
public String toString() {
return "StuSignRequest{" +
"signCode=" + signCode +
", userId=" + userId +
", userSignId=" + userSignId +
'}';
}
}

@ -0,0 +1,151 @@
package com.example.stlink.model.request;
public class UserModifyRequest {
/**
* id
*/
private Long id;
/**
* ()
*/
private String avatar;
/**
*
*/
private String collegeName;
/**
*
*/
private String email;
/**
* true:true
*/
private Boolean gender;
/**
* /
*/
private Long idNumber;
/**
* ()
*/
private Long inSchoolTime;
/**
*
*
*/
private String phone;
/**
*
*/
private String realName;
/**
*
*/
private String userName;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public String getCollegeName() {
return collegeName;
}
public void setCollegeName(String collegeName) {
this.collegeName = collegeName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Boolean getGender() {
return gender;
}
public void setGender(Boolean gender) {
this.gender = gender;
}
public Long getIdNumber() {
return idNumber;
}
public void setIdNumber(Long idNumber) {
this.idNumber = idNumber;
}
public Long getInSchoolTime() {
return inSchoolTime;
}
public void setInSchoolTime(Long inSchoolTime) {
this.inSchoolTime = inSchoolTime;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Override
public String toString() {
return "UserModifyRequest{" +
"id=" + id +
", avatar='" + avatar + '\'' +
", collegeName='" + collegeName + '\'' +
", email='" + email + '\'' +
", gender=" + gender +
", idNumber=" + idNumber +
", inSchoolTime=" + inSchoolTime +
", phone='" + phone + '\'' +
", realName='" + realName + '\'' +
", userName='" + userName + '\'' +
'}';
}
}

@ -0,0 +1,52 @@
package com.example.stlink.model.request;
public class UserRegisterRequest {
/**
*
*/
private String password;
/**
*
*/
private Integer roleId;
/**
*
*/
private String userName;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Override
public String toString() {
return "UserRegisterRequest{" +
"password='" + password + '\'' +
", roleId=" + roleId +
", userName='" + userName + '\'' +
'}';
}
}

@ -0,0 +1,45 @@
package com.example.stlink.model.response;
public class BaseResponse <T> {
private int code;
private String msg;
private T data;
public final static int RESPONSE_SUCCESS = 0;
public BaseResponse(){}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
@Override
public String toString() {
return "BaseResponse{" +
"code=" + code +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}

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

Loading…
Cancel
Save