diff --git a/app/piggy.png b/app/piggy.png deleted file mode 100644 index e34865a..0000000 Binary files a/app/piggy.png and /dev/null differ diff --git a/app/release/app-release.apk b/app/release/app-release.apk deleted file mode 100644 index e13d751..0000000 Binary files a/app/release/app-release.apk and /dev/null differ diff --git a/app/release/app.aab b/app/release/app.aab deleted file mode 100644 index 81acfd0..0000000 Binary files a/app/release/app.aab and /dev/null differ diff --git a/app/release/output.json b/app/release/output.json deleted file mode 100644 index 016d299..0000000 --- a/app/release/output.json +++ /dev/null @@ -1 +0,0 @@ -[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":3,"versionName":"1.3","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] \ No newline at end of file diff --git a/app/src/main/java/cc/liuyx/note/BaseActivity.java b/app/src/main/java/cc/liuyx/note/activity/BaseActivity.java similarity index 100% rename from app/src/main/java/cc/liuyx/note/BaseActivity.java rename to app/src/main/java/cc/liuyx/note/activity/BaseActivity.java diff --git a/app/src/main/java/cc/liuyx/note/EditActivity.java b/app/src/main/java/cc/liuyx/note/activity/EditActivity.java similarity index 100% rename from app/src/main/java/cc/liuyx/note/EditActivity.java rename to app/src/main/java/cc/liuyx/note/activity/EditActivity.java diff --git a/app/src/main/java/cc/liuyx/note/FabColorActivity.java b/app/src/main/java/cc/liuyx/note/activity/FabColorActivity.java similarity index 100% rename from app/src/main/java/cc/liuyx/note/FabColorActivity.java rename to app/src/main/java/cc/liuyx/note/activity/FabColorActivity.java diff --git a/app/src/main/java/cc/liuyx/note/MainActivity.java b/app/src/main/java/cc/liuyx/note/activity/MainActivity.java similarity index 100% rename from app/src/main/java/cc/liuyx/note/MainActivity.java rename to app/src/main/java/cc/liuyx/note/activity/MainActivity.java diff --git a/app/src/main/java/cc/liuyx/note/UserSettingsActivity.java b/app/src/main/java/cc/liuyx/note/activity/UserSettingsActivity.java similarity index 100% rename from app/src/main/java/cc/liuyx/note/UserSettingsActivity.java rename to app/src/main/java/cc/liuyx/note/activity/UserSettingsActivity.java diff --git a/uml/UML.puml b/uml/UML.puml new file mode 100644 index 0000000..c70276d --- /dev/null +++ b/uml/UML.puml @@ -0,0 +1,337 @@ +@startuml +class cc.liuyx.note.alarm.PlanDatabase { ++ {static} String TABLE_NAME ++ {static} String TITLE ++ {static} String CONTENT ++ {static} String ID ++ {static} String TIME ++ {static} String MODE ++ void onCreate(SQLiteDatabase) ++ void onUpgrade(SQLiteDatabase,int,int) +} +abstract class cc.liuyx.note.BaseActivity { ++ String TAG ++ String ACTION +# BroadcastReceiver receiver +# IntentFilter filter +# void onCreate(Bundle) ++ boolean isNightMode() ++ void setNightMode() +# {abstract}void needRefresh() ++ void onDestroy() ++ long calStrToSec(String) +} +class cc.liuyx.note.entity.Note { +- long id +- String content +- String time +- int tag ++ long getId() ++ String getContent() ++ String getTime() ++ void setId(long) ++ void setContent(String) ++ void setTime(String) ++ String toString() ++ int getTag() ++ void setTag(int) +} +class cc.liuyx.note.alarm.PlanAdapter { +- Context mContext +- List backList +- List planList +~ PlanAdapter.MyFilter mFilter ++ int getCount() ++ Object getItem(int) ++ long getItemId(int) ++ View getView(int,View,ViewGroup) ++ Filter getFilter() +} +class cc.liuyx.note.alarm.PlanAdapter$MyFilter { +# FilterResults performFiltering(CharSequence) +# void publishResults(CharSequence,FilterResults) +} +class cc.liuyx.note.db.CRUD { +~ SQLiteOpenHelper dbHandler +~ SQLiteDatabase db +- {static} String[] columns ++ void open() ++ void close() ++ void addNote(Note) ++ Note getNote(long) ++ List getAllNotes() ++ void updateNote(Note) ++ void removeNote(Note) +} +class cc.liuyx.note.adapter.NoteAdapter { +- Context mContext +- List backList +- List noteList +- MyFilter mFilter ++ int getCount() ++ Object getItem(int) ++ long getItemId(int) ++ View getView(int,View,ViewGroup) ++ Filter getFilter() +} +class cc.liuyx.note.adapter.NoteAdapter$MyFilter { +# FilterResults performFiltering(CharSequence) +# void publishResults(CharSequence,FilterResults) +} +class cc.liuyx.note.FabColorActivity { +- Toolbar myToolbar +- int openMode +- SharedPreferences sharedPreferences +- ImageView q +# void onCreate(Bundle) +- void initImageView() +- void chooseCurFabColor(int) +- void setClick() ++ void onClick(View) ++ boolean onKeyDown(int,KeyEvent) +} +class com.example.atry.ExampleInstrumentedTest { ++ void useAppContext() +} +class cc.liuyx.note.alarm.AlarmReceiver { +- String channelId +- String name ++ void onReceive(Context,Intent) +} +class cc.liuyx.note.UserSettingsActivity { +- Switch nightMode +- Switch reverseSort +- LinearLayout fabColor +- LinearLayout fabPlanColor +- Switch noteTitle +- SharedPreferences sharedPreferences +- {static} boolean night_change +# void onCreate(Bundle) +# void needRefresh() +- void initView() +# void onActivityResult(int,int,Intent) +- void setSelfNightMode() +- void setNightModePref(boolean) ++ boolean onKeyDown(int,KeyEvent) +} +class cc.liuyx.note.alarm.Plan { +- long id +- String title +- String content +- Calendar planTime ++ int getYear() ++ int getMonth() ++ int getDay() ++ int getHour() ++ int getMinute() ++ long getId() ++ void setId(long) ++ String getTitle() ++ void setTitle(String) ++ String getContent() ++ void setContent(String) ++ Calendar getPlanTime() ++ String getTime() ++ void setTime(String) +} +class cc.liuyx.note.adapter.TagAdapter { +- Context context +- List tagList +- List numList ++ int getCount() ++ Object getItem(int) ++ long getItemId(int) ++ View getView(int,View,ViewGroup) +} +class cc.liuyx.note.alarm.CRUD { +~ SQLiteOpenHelper dbHandler +~ SQLiteDatabase db +- {static} String[] columns ++ void open() ++ void close() ++ Plan addPlan(Plan) ++ Plan getPlan(long) ++ List getAllPlans() ++ int updatePlan(Plan) ++ void removePlan(Plan) +} +class cc.liuyx.note.alarm.EditAlarmActivity { +- DatePickerDialog.OnDateSetListener dateSetListener +- TimePickerDialog.OnTimeSetListener timeSetListener +- EditText et_title +- EditText et +- Button set_date +- Button set_time +- TextView date +- TextView time +- Plan plan +- int[] dateArray +- int[] timeArray +- int openMode +- String old_title +- String old_content +- String old_time +- long id +- boolean timeChange +# void onCreate(Bundle) ++ boolean onKeyDown(int,KeyEvent) ++ boolean onCreateOptionsMenu(Menu) ++ boolean onOptionsItemSelected(MenuItem) +# void needRefresh() +- void init() +- void setDateTV(int,int,int) +- void setTimeTV(int,int) ++ void onClick(View) +- void isTimeChange() +- boolean canBeSet() +} +class cc.liuyx.note.MainActivity { +- NoteDatabase dbHelper +- PlanDatabase planDbHelper +- FloatingActionButton fab +- FloatingActionButton fab_alarm +- ListView lv +- ListView lv_plan +- LinearLayout lv_layout +- LinearLayout lv_plan_layout +- Context context +- NoteAdapter adapter +- PlanAdapter planAdapter +- List noteList +- List planList +- TextView mEmptyView +- Toolbar myToolbar +- PopupWindow popupWindow +- PopupWindow popupCover +- LayoutInflater layoutInflater +- RelativeLayout main +- ViewGroup customView +- ViewGroup coverView +- WindowManager wm +- DisplayMetrics metrics +- TagAdapter tagAdapter +- TextView setting_text +- ImageView setting_image +- ListView lv_tag +- TextView add_tag +- BroadcastReceiver myReceiver +- Achievement achievement +- SharedPreferences sharedPreferences +- Switch content_switch +- AlarmManager alarmManager +~ String[] list_String +# void onCreate(Bundle) +- void showPopUpWindow() +- void refreshTagList() +- void resetTagsX(AdapterView) +# void needRefresh() ++ void initView() +- void refreshLvVisibility() ++ void initPopupView() +- void initPrefs() ++ boolean onCreateOptionsMenu(Menu) ++ boolean onOptionsItemSelected(MenuItem) ++ void refreshListView() +- void chooseFabColor(int) +- void chooseFabPlanColor(int) ++ void onItemClick(AdapterView,View,int,long) +# void onActivityResult(int,int,Intent) ++ boolean onItemLongClick(AdapterView,View,int,long) ++ void sortNotes(List,int) ++ void sortPlans(List,int) ++ long dateStrToSec(String) ++ List numOfTagNotes(List) ++ int npLong(Long) ++ void onDestroy() +- void startAlarm(Plan) +- void startAlarms(List) +- void cancelAlarm(Plan) +- void cancelAlarms(List) ++ void onResume() +} +class cc.liuyx.note.MainActivity$Achievement { +- SharedPreferences sharedPreferences +- int noteNumber +- int wordNumber +- int noteLevel +- int wordLevel +- void getPref() +- void initPref() +- void addCurrent(List) ++ void addNote(String) ++ void deleteNote() ++ void editNote(String,String) ++ void noteNumberAchievement(int) ++ void wordNumberAchievement(int) ++ void announcement(String,int,int) ++ String annoucementTitle(int,int) ++ void setState(int) ++ void listen() ++ void resetAll() +} +class cc.liuyx.note.EditActivity { +- NoteDatabase dbHelper +- Context context +- EditText et +- String old_content +- String old_time +- int old_Tag +- long id +- int openMode +- int tag +- boolean tagChange +# void onCreate(Bundle) +# void needRefresh() ++ boolean onCreateOptionsMenu(Menu) ++ boolean onKeyDown(int,KeyEvent) ++ boolean onOptionsItemSelected(MenuItem) ++ String dateToStr() +- void deleteNote(Intent) +} +class cc.liuyx.note.entity.SpinnerItem { +- String tagName +- int tagId ++ String getTagName() ++ void setTagName(String) ++ int getTagId() ++ void setTagId(int) +} +class cc.liuyx.note.db.NoteDatabase { ++ {static} String TABLE_NAME ++ {static} String CONTENT ++ {static} String ID ++ {static} String TIME ++ {static} String MODE ++ void onCreate(SQLiteDatabase) ++ void onUpgrade(SQLiteDatabase,int,int) +- void updateMode(SQLiteDatabase) +} +class com.example.atry.ExampleUnitTest { ++ void addition_isCorrect() +} + + +android.database.sqlite.SQLiteOpenHelper <|-- cc.liuyx.note.alarm.PlanDatabase +android.support.v7.app.AppCompatActivity <|-- cc.liuyx.note.BaseActivity +android.widget.Filterable <|.. cc.liuyx.note.alarm.PlanAdapter +android.widget.BaseAdapter <|-- cc.liuyx.note.alarm.PlanAdapter +cc.liuyx.note.alarm.PlanAdapter +.. cc.liuyx.note.alarm.PlanAdapter$MyFilter +cc.liuyx.note.alarm.Filter <|-- cc.liuyx.note.alarm.PlanAdapter$MyFilter +android.widget.Filterable <|.. cc.liuyx.note.adapter.NoteAdapter +android.widget.BaseAdapter <|-- cc.liuyx.note.adapter.NoteAdapter +cc.liuyx.note.adapter.NoteAdapter +.. cc.liuyx.note.adapter.NoteAdapter$MyFilter +cc.liuyx.note.adapter.Filter <|-- cc.liuyx.note.adapter.NoteAdapter$MyFilter +cc.liuyx.note.OnClickListener <|.. cc.liuyx.note.FabColorActivity +android.support.v7.app.AppCompatActivity <|-- cc.liuyx.note.FabColorActivity +android.content.BroadcastReceiver <|-- cc.liuyx.note.alarm.AlarmReceiver +cc.liuyx.note.BaseActivity <|-- cc.liuyx.note.UserSettingsActivity +android.widget.BaseAdapter <|-- cc.liuyx.note.adapter.TagAdapter +cc.liuyx.note.alarm.OnClickListener <|.. cc.liuyx.note.alarm.EditAlarmActivity +cc.liuyx.note.BaseActivity <|-- cc.liuyx.note.alarm.EditAlarmActivity +android.widget.AdapterView.OnItemClickListener <|.. cc.liuyx.note.MainActivity +android.widget.AdapterView.OnItemLongClickListener <|.. cc.liuyx.note.MainActivity +cc.liuyx.note.BaseActivity <|-- cc.liuyx.note.MainActivity +cc.liuyx.note.MainActivity +.. cc.liuyx.note.MainActivity$Achievement +cc.liuyx.note.BaseActivity <|-- cc.liuyx.note.EditActivity +android.database.sqlite.SQLiteOpenHelper <|-- cc.liuyx.note.db.NoteDatabase +@enduml \ No newline at end of file diff --git a/uml/activity.puml b/uml/activity.puml new file mode 100644 index 0000000..639f824 --- /dev/null +++ b/uml/activity.puml @@ -0,0 +1,156 @@ +@startuml +class cc.liuyx.note.UserSettingsActivity { +- Switch nightMode +- Switch reverseSort +- LinearLayout fabColor +- LinearLayout fabPlanColor +- Switch noteTitle +- SharedPreferences sharedPreferences +- {static} boolean night_change +# void onCreate(Bundle) +# void needRefresh() +- void initView() +# void onActivityResult(int,int,Intent) +- void setSelfNightMode() +- void setNightModePref(boolean) ++ boolean onKeyDown(int,KeyEvent) +} +class cc.liuyx.note.FabColorActivity { +- Toolbar myToolbar +- int openMode +- SharedPreferences sharedPreferences +- ImageView q +# void onCreate(Bundle) +- void initImageView() +- void chooseCurFabColor(int) +- void setClick() ++ void onClick(View) ++ boolean onKeyDown(int,KeyEvent) +} +class cc.liuyx.note.EditActivity { +- NoteDatabase dbHelper +- Context context +- EditText et +- String old_content +- String old_time +- int old_Tag +- long id +- int openMode +- int tag +- boolean tagChange +# void onCreate(Bundle) +# void needRefresh() ++ boolean onCreateOptionsMenu(Menu) ++ boolean onKeyDown(int,KeyEvent) ++ boolean onOptionsItemSelected(MenuItem) ++ String dateToStr() +- void deleteNote(Intent) +} +class cc.liuyx.note.MainActivity { +- NoteDatabase dbHelper +- PlanDatabase planDbHelper +- FloatingActionButton fab +- FloatingActionButton fab_alarm +- ListView lv +- ListView lv_plan +- LinearLayout lv_layout +- LinearLayout lv_plan_layout +- Context context +- NoteAdapter adapter +- PlanAdapter planAdapter +- List noteList +- List planList +- TextView mEmptyView +- Toolbar myToolbar +- PopupWindow popupWindow +- PopupWindow popupCover +- LayoutInflater layoutInflater +- RelativeLayout main +- ViewGroup customView +- ViewGroup coverView +- WindowManager wm +- DisplayMetrics metrics +- TagAdapter tagAdapter +- TextView setting_text +- ImageView setting_image +- ListView lv_tag +- TextView add_tag +- BroadcastReceiver myReceiver +- Achievement achievement +- SharedPreferences sharedPreferences +- Switch content_switch +- AlarmManager alarmManager +~ String[] list_String +# void onCreate(Bundle) +- void showPopUpWindow() +- void refreshTagList() +- void resetTagsX(AdapterView) +# void needRefresh() ++ void initView() +- void refreshLvVisibility() ++ void initPopupView() +- void initPrefs() ++ boolean onCreateOptionsMenu(Menu) ++ boolean onOptionsItemSelected(MenuItem) ++ void refreshListView() +- void chooseFabColor(int) +- void chooseFabPlanColor(int) ++ void onItemClick(AdapterView,View,int,long) +# void onActivityResult(int,int,Intent) ++ boolean onItemLongClick(AdapterView,View,int,long) ++ void sortNotes(List,int) ++ void sortPlans(List,int) ++ long dateStrToSec(String) ++ List numOfTagNotes(List) ++ int npLong(Long) ++ void onDestroy() +- void startAlarm(Plan) +- void startAlarms(List) +- void cancelAlarm(Plan) +- void cancelAlarms(List) ++ void onResume() +} +class cc.liuyx.note.MainActivity$Achievement { +- SharedPreferences sharedPreferences +- int noteNumber +- int wordNumber +- int noteLevel +- int wordLevel +- void getPref() +- void initPref() +- void addCurrent(List) ++ void addNote(String) ++ void deleteNote() ++ void editNote(String,String) ++ void noteNumberAchievement(int) ++ void wordNumberAchievement(int) ++ void announcement(String,int,int) ++ String annoucementTitle(int,int) ++ void setState(int) ++ void listen() ++ void resetAll() +} +abstract class cc.liuyx.note.BaseActivity { ++ String TAG ++ String ACTION +# BroadcastReceiver receiver +# IntentFilter filter +# void onCreate(Bundle) ++ boolean isNightMode() ++ void setNightMode() +# {abstract}void needRefresh() ++ void onDestroy() ++ long calStrToSec(String) +} + + +cc.liuyx.note.BaseActivity <|-- cc.liuyx.note.UserSettingsActivity +cc.liuyx.note.OnClickListener <|.. cc.liuyx.note.FabColorActivity +android.support.v7.app.AppCompatActivity <|-- cc.liuyx.note.FabColorActivity +cc.liuyx.note.BaseActivity <|-- cc.liuyx.note.EditActivity +android.widget.AdapterView.OnItemClickListener <|.. cc.liuyx.note.MainActivity +android.widget.AdapterView.OnItemLongClickListener <|.. cc.liuyx.note.MainActivity +cc.liuyx.note.BaseActivity <|-- cc.liuyx.note.MainActivity +cc.liuyx.note.MainActivity +.. cc.liuyx.note.MainActivity$Achievement +android.support.v7.app.AppCompatActivity <|-- cc.liuyx.note.BaseActivity +@enduml \ No newline at end of file diff --git a/uml/adapter.puml b/uml/adapter.puml new file mode 100644 index 0000000..a0b8ea6 --- /dev/null +++ b/uml/adapter.puml @@ -0,0 +1,33 @@ +@startuml +class cc.liuyx.note.adapter.TagAdapter { +- Context context +- List tagList +- List numList ++ int getCount() ++ Object getItem(int) ++ long getItemId(int) ++ View getView(int,View,ViewGroup) +} +class cc.liuyx.note.adapter.NoteAdapter { +- Context mContext +- List backList +- List noteList +- MyFilter mFilter ++ int getCount() ++ Object getItem(int) ++ long getItemId(int) ++ View getView(int,View,ViewGroup) ++ Filter getFilter() +} +class cc.liuyx.note.adapter.NoteAdapter$MyFilter { +# FilterResults performFiltering(CharSequence) +# void publishResults(CharSequence,FilterResults) +} + + +android.widget.BaseAdapter <|-- cc.liuyx.note.adapter.TagAdapter +android.widget.Filterable <|.. cc.liuyx.note.adapter.NoteAdapter +android.widget.BaseAdapter <|-- cc.liuyx.note.adapter.NoteAdapter +cc.liuyx.note.adapter.NoteAdapter +.. cc.liuyx.note.adapter.NoteAdapter$MyFilter +cc.liuyx.note.adapter.Filter <|-- cc.liuyx.note.adapter.NoteAdapter$MyFilter +@enduml \ No newline at end of file diff --git a/uml/alarm.puml b/uml/alarm.puml new file mode 100644 index 0000000..0b50581 --- /dev/null +++ b/uml/alarm.puml @@ -0,0 +1,104 @@ +@startuml +class cc.liuyx.note.alarm.PlanDatabase { ++ {static} String TABLE_NAME ++ {static} String TITLE ++ {static} String CONTENT ++ {static} String ID ++ {static} String TIME ++ {static} String MODE ++ void onCreate(SQLiteDatabase) ++ void onUpgrade(SQLiteDatabase,int,int) +} +class cc.liuyx.note.alarm.Plan { +- long id +- String title +- String content +- Calendar planTime ++ int getYear() ++ int getMonth() ++ int getDay() ++ int getHour() ++ int getMinute() ++ long getId() ++ void setId(long) ++ String getTitle() ++ void setTitle(String) ++ String getContent() ++ void setContent(String) ++ Calendar getPlanTime() ++ String getTime() ++ void setTime(String) +} +class cc.liuyx.note.alarm.PlanAdapter { +- Context mContext +- List backList +- List planList +~ PlanAdapter.MyFilter mFilter ++ int getCount() ++ Object getItem(int) ++ long getItemId(int) ++ View getView(int,View,ViewGroup) ++ Filter getFilter() +} +class cc.liuyx.note.alarm.PlanAdapter$MyFilter { +# FilterResults performFiltering(CharSequence) +# void publishResults(CharSequence,FilterResults) +} +class cc.liuyx.note.alarm.CRUD { +~ SQLiteOpenHelper dbHandler +~ SQLiteDatabase db +- {static} String[] columns ++ void open() ++ void close() ++ Plan addPlan(Plan) ++ Plan getPlan(long) ++ List getAllPlans() ++ int updatePlan(Plan) ++ void removePlan(Plan) +} +class cc.liuyx.note.alarm.EditAlarmActivity { +- DatePickerDialog.OnDateSetListener dateSetListener +- TimePickerDialog.OnTimeSetListener timeSetListener +- EditText et_title +- EditText et +- Button set_date +- Button set_time +- TextView date +- TextView time +- Plan plan +- int[] dateArray +- int[] timeArray +- int openMode +- String old_title +- String old_content +- String old_time +- long id +- boolean timeChange +# void onCreate(Bundle) ++ boolean onKeyDown(int,KeyEvent) ++ boolean onCreateOptionsMenu(Menu) ++ boolean onOptionsItemSelected(MenuItem) +# void needRefresh() +- void init() +- void setDateTV(int,int,int) +- void setTimeTV(int,int) ++ void onClick(View) +- void isTimeChange() +- boolean canBeSet() +} +class cc.liuyx.note.alarm.AlarmReceiver { +- String channelId +- String name ++ void onReceive(Context,Intent) +} + + +android.database.sqlite.SQLiteOpenHelper <|-- cc.liuyx.note.alarm.PlanDatabase +android.widget.Filterable <|.. cc.liuyx.note.alarm.PlanAdapter +android.widget.BaseAdapter <|-- cc.liuyx.note.alarm.PlanAdapter +cc.liuyx.note.alarm.PlanAdapter +.. cc.liuyx.note.alarm.PlanAdapter$MyFilter +cc.liuyx.note.alarm.Filter <|-- cc.liuyx.note.alarm.PlanAdapter$MyFilter +cc.liuyx.note.alarm.OnClickListener <|.. cc.liuyx.note.alarm.EditAlarmActivity +cc.liuyx.note.BaseActivity <|-- cc.liuyx.note.alarm.EditAlarmActivity +android.content.BroadcastReceiver <|-- cc.liuyx.note.alarm.AlarmReceiver +@enduml \ No newline at end of file diff --git a/uml/db.puml b/uml/db.puml new file mode 100644 index 0000000..0f72ea8 --- /dev/null +++ b/uml/db.puml @@ -0,0 +1,27 @@ +@startuml +class cc.liuyx.note.db.CRUD { +~ SQLiteOpenHelper dbHandler +~ SQLiteDatabase db +- {static} String[] columns ++ void open() ++ void close() ++ void addNote(Note) ++ Note getNote(long) ++ List getAllNotes() ++ void updateNote(Note) ++ void removeNote(Note) +} +class cc.liuyx.note.db.NoteDatabase { ++ {static} String TABLE_NAME ++ {static} String CONTENT ++ {static} String ID ++ {static} String TIME ++ {static} String MODE ++ void onCreate(SQLiteDatabase) ++ void onUpgrade(SQLiteDatabase,int,int) +- void updateMode(SQLiteDatabase) +} + + +android.database.sqlite.SQLiteOpenHelper <|-- cc.liuyx.note.db.NoteDatabase +@enduml \ No newline at end of file