diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/SignInData.kt b/BaseModule/src/main/java/com/xscm/moduleutil/bean/SignInData.kt
new file mode 100644
index 00000000..5310eb10
--- /dev/null
+++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/SignInData.kt
@@ -0,0 +1,115 @@
+package com.xscm.moduleutil.bean
+
+import com.chad.library.adapter.base.entity.MultiItemEntity
+
+/**
+ * 项目名称:羽声语音
+ * 时间:2025/12/12 10:35
+ * 用途:签到实体类
+ */
+class SignInData : MultiItemEntity{
+ val TYPE_NORMAL: Int = 0 // 普通类型,使用day_sgin布局
+ val TYPE_DOUBLE: Int = 1 // 双倍宽度类型,使用day_sgin2布局
+ var viewType: Int = TYPE_NORMAL // 默认为普通类型
+
+ var day: Int = 0 //第几天
+ var sign_in_date: String = "" //日期
+ var sign_in_status: Int = 0 // 签到状态:1已签到 0未签到
+ var sign_in_status_str: String = "" //已签到
+ var is_today: Int = 0 //是否是当天 0否 1是
+ var gift_name: String = "" //礼物名称
+ var num: String = "" //数量
+ var gift_price: Int = 0 //价格
+ var type: Int = 0 //类型: 1金币 2礼物 3装扮 4钻石
+ var base_image: String = "" //礼物图片
+ override fun getItemType(): Int {
+ return viewType
+ }
+
+ /* "gift_bag": [
+ {
+ "day": 1, //第几天
+ "sign_in_date": "2025-12-09", //日期
+ "sign_in_status": 1, //签到状态:1已签到 0未签到
+ "sign_in_status_str": "已签到",
+ "is_today": 0, //是否是当天 0否 1是
+ "gift_name": "金币", //礼物名称
+ "num": 1, //数量
+ "gift_price": 1, //价格
+ "type": 1, //类型: 1金币 2礼物 3装扮 4钻石
+ "base_image": "https://test.vespa.qxyushen.top/static/image/icon/gold.png" //礼物图片
+ },
+ {
+ "day": 2,
+ "sign_in_date": "2025-12-10",
+ "sign_in_status": 1,
+ "sign_in_status_str": "已签到",
+ "is_today": 0,
+ "gift_name": "打工狗",
+ "num": "1 个",
+ "gift_price": "9",
+ "type": 2,
+ "base_image": "https://cos.xscmmidi.site/admin/3143tianxuanbanzhuangou_17615346376493.png"
+ },
+ {
+ "day": 3,
+ "sign_in_date": "2025-12-11",
+ "sign_in_status": 1,
+ "sign_in_status_str": "已签到",
+ "is_today": 0,
+ "gift_name": "神皇",
+ "num": "3 天",
+ "gift_price": 30,
+ "type": 3,
+ "base_image": "https://midi01.oss-cn-beijing.aliyuncs.com/5544shenhuang_17579016149523.png"
+ },
+ {
+ "day": 4,
+ "sign_in_date": "2025-12-12",
+ "sign_in_status": 1,
+ "sign_in_status_str": "已签到",
+ "is_today": 1,
+ "gift_name": "心动喷发",
+ "num": "2 个",
+ "gift_price": "100",
+ "type": 2,
+ "base_image": "https://cos.xscmmidi.site/admin/3300xindongpenfa_17615347008740.png"
+ },
+ {
+ "day": 5,
+ "sign_in_date": "2025-12-13",
+ "sign_in_status": 0,
+ "sign_in_status_str": "未签到",
+ "is_today": 0,
+ "gift_name": "钻石",
+ "num": 20,
+ "gift_price": 1,
+ "type": 4,
+ "base_image": "https://test.vespa.qxyushen.top/static/image/icon/gold.png"
+ },
+ {
+ "day": 6,
+ "sign_in_date": "2025-12-14",
+ "sign_in_status": 0,
+ "sign_in_status_str": "未签到",
+ "is_today": 0,
+ "gift_name": "王者之戒",
+ "num": "1 个",
+ "gift_price": "19",
+ "type": 2,
+ "base_image": "https://cos.xscmmidi.site/admin/5390wangzhezhijie_17615353361010.png"
+ },
+ {
+ "day": 7,
+ "sign_in_date": "2025-12-15",
+ "sign_in_status": 0,
+ "sign_in_status_str": "未签到",
+ "is_today": 0,
+ "gift_name": "财源滚滚",
+ "num": "30 天",
+ "gift_price": 288,
+ "type": 3,
+ "base_image": "https://midi01.oss-cn-beijing.aliyuncs.com/2160caiyuangunguntouxiangkuang_17579008394073.png"
+ }
+ ]*/
+}
\ No newline at end of file
diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/TasksSignStatus.kt b/BaseModule/src/main/java/com/xscm/moduleutil/bean/TasksSignStatus.kt
new file mode 100644
index 00000000..acbbd77c
--- /dev/null
+++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/TasksSignStatus.kt
@@ -0,0 +1,11 @@
+package com.xscm.moduleutil.bean
+
+/**
+ * 项目名称:羽声语音
+ * 时间:2025/12/12 14:54
+ * 用途:签到状态
+ */
+class TasksSignStatus {
+ var status : Int=0
+ var status_str: String=""
+}
\ No newline at end of file
diff --git a/BaseModule/src/main/res/drawable/bg_r16_deff85_cfffdc.xml b/BaseModule/src/main/res/drawable/bg_r16_deff85_cfffdc.xml
new file mode 100644
index 00000000..68fc15a3
--- /dev/null
+++ b/BaseModule/src/main/res/drawable/bg_r16_deff85_cfffdc.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/BaseModule/src/main/res/drawable/bg_r99_e7fe67_90ff86_5cfbbd.xml b/BaseModule/src/main/res/drawable/bg_r99_e7fe67_90ff86_5cfbbd.xml
new file mode 100644
index 00000000..4e2d3bac
--- /dev/null
+++ b/BaseModule/src/main/res/drawable/bg_r99_e7fe67_90ff86_5cfbbd.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/BaseModule/src/main/res/drawable/selector_sign_bg.xml b/BaseModule/src/main/res/drawable/selector_sign_bg.xml
new file mode 100644
index 00000000..71db39f0
--- /dev/null
+++ b/BaseModule/src/main/res/drawable/selector_sign_bg.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/MainModule/src/main/java/com/xscm/modulemain/dialog/SignInDialog.kt b/MainModule/src/main/java/com/xscm/modulemain/dialog/SignInDialog.kt
new file mode 100644
index 00000000..47d039d3
--- /dev/null
+++ b/MainModule/src/main/java/com/xscm/modulemain/dialog/SignInDialog.kt
@@ -0,0 +1,241 @@
+package com.xscm.modulemain.dialog
+
+import android.content.Context
+import android.view.Gravity
+import android.view.View
+import android.view.ViewGroup
+import com.blankj.utilcode.util.ScreenUtils
+import com.xscm.modulemain.R
+import com.xscm.modulemain.databinding.DialogSignBinding
+import com.xscm.moduleutil.bean.SignInData
+import com.xscm.moduleutil.http.BaseObserver
+import com.xscm.moduleutil.http.RetrofitClient
+import com.xscm.moduleutil.utils.ImageLoader
+import com.xscm.moduleutil.widget.dialog.BaseDialog
+import io.reactivex.disposables.Disposable
+
+/**
+ * 项目名称:羽声语音
+ * 时间:2025/12/9 18:21
+ * 用途:签到
+ */
+class SignInDialog(context: Context) : BaseDialog(context) {
+ var signInDataLists: List? = ArrayList()
+ private var onCloseCallback: (() -> Unit)? = null
+
+ fun setOnCloseListener(callback: () -> Unit) = apply {
+ onCloseCallback = callback
+ }
+
+
+ init {
+ // 设置对话框从底部弹出
+ window?.setGravity(Gravity.CENTER)
+ // 设置对话框的宽度为屏幕宽度
+ window?.setLayout(
+ (ScreenUtils.getScreenWidth() * 315f / 375).toInt(),
+ ViewGroup.LayoutParams.WRAP_CONTENT
+ )
+ // 添加动画效果
+ window?.setWindowAnimations(com.xscm.moduleutil.R.style.DialogAnimationt)
+ setCancelable(false)
+ setCanceledOnTouchOutside(false)
+ }
+
+ override fun getLayoutId(): Int {
+ return R.layout.dialog_sign
+ }
+
+ override fun initView() {
+ mBinding.ivClose.setOnClickListener {
+ onCloseCallback?.invoke()
+ dismiss()
+ }
+ mBinding.btnSign.setOnClickListener {
+
+ RetrofitClient.getInstance().dailyTasksSign(object : BaseObserver() {
+ override fun onSubscribe(d: Disposable) {
+ }
+
+ override fun onNext(t: String) {
+ var signInSuccessDialog=SignInSuccessDialog(context)
+ signInSuccessDialog.viewData(signInData)
+ signInSuccessDialog.setOnCloseListener {
+ onCloseCallback?.invoke()
+ }
+ signInSuccessDialog.show()
+ dismiss()
+ }
+ })
+ }
+ }
+
+ override fun initData() {
+ RetrofitClient.getInstance().signIn(object : BaseObserver>() {
+ override fun onSubscribe(d: Disposable) {
+ }
+
+ override fun onNext(t: List) {
+ signInDataLists = t
+ for (i in signInDataLists!!) {
+ setUpView(i)
+ }
+ }
+
+ })
+ }
+
+ var signInData = SignInData()
+
+ fun setUpView(signInData: SignInData) {
+ if (signInData.is_today == 1) {
+ this.signInData = signInData
+ if (signInData.sign_in_status == 1) {
+ mBinding.btnSign.text = "已签到"
+ mBinding.btnSign.isEnabled = false
+ mBinding.btnSign.setBackgroundResource(com.xscm.moduleutil.R.drawable.bg_r53_f3f3f3)
+ }
+ }
+ if (signInData.day == 1) {
+ mBinding.day1.tvDay.text = signInData.day.toString()
+
+ mBinding.day1.tvSiginPrice.text = signInData.gift_name + "*" + signInData.num
+ if (signInData.sign_in_status == 1) {
+ mBinding.day1.ivCollected.visibility = View.VISIBLE
+ mBinding.day1.root.setBackgroundResource(R.drawable.select_item_click)
+ ImageLoader.loadImage(
+ context,
+ mBinding.day1.ivSign,
+ signInData.base_image,
+ 0.4f
+ )
+ } else {
+ mBinding.day1.ivCollected.visibility = View.GONE
+ com.xscm.moduleutil.utils.ImageUtils.loadHead(
+ signInData.base_image,
+ mBinding.day1.ivSign
+ )
+ }
+ } else if (signInData.day == 2) {
+ mBinding.day2.tvDay.text = signInData.day.toString()
+
+ mBinding.day2.tvSiginPrice.text = signInData.gift_name + "*" + signInData.num
+ if (signInData.sign_in_status == 1) {
+ mBinding.day2.ivCollected.visibility = View.VISIBLE
+ mBinding.day2.root.setBackgroundResource(R.drawable.select_item_click)
+ ImageLoader.loadImage(
+ context,
+ mBinding.day2.ivSign,
+ signInData.base_image,
+ 0.4f
+ )
+ } else {
+ mBinding.day2.ivCollected.visibility = View.GONE
+ com.xscm.moduleutil.utils.ImageUtils.loadHead(
+ signInData.base_image,
+ mBinding.day2.ivSign
+ )
+ }
+ } else if (signInData.day == 3) {
+ mBinding.day3.tvDay.text = signInData.day.toString()
+
+ mBinding.day3.tvSiginPrice.text = signInData.gift_name + "*" + signInData.num
+ if (signInData.sign_in_status == 1) {
+ mBinding.day3.ivCollected.visibility = View.VISIBLE
+ mBinding.day3.root.setBackgroundResource(R.drawable.select_item_click)
+ ImageLoader.loadImage(
+ context,
+ mBinding.day3.ivSign,
+ signInData.base_image,
+ 0.4f
+ )
+ } else {
+ mBinding.day3.ivCollected.visibility = View.GONE
+ com.xscm.moduleutil.utils.ImageUtils.loadHead(
+ signInData.base_image,
+ mBinding.day3.ivSign
+ )
+ }
+ } else if (signInData.day == 4) {
+ mBinding.day4.tvDay.text = signInData.day.toString()
+
+ mBinding.day4.tvSiginPrice.text = signInData.gift_name + "*" + signInData.num
+ if (signInData.sign_in_status == 1) {
+ mBinding.day4.ivCollected.visibility = View.VISIBLE
+ mBinding.day4.root.setBackgroundResource(R.drawable.select_item_click)
+ ImageLoader.loadImage(
+ context,
+ mBinding.day4.ivSign,
+ signInData.base_image,
+ 0.4f
+ )
+ } else {
+ mBinding.day4.ivCollected.visibility = View.GONE
+ com.xscm.moduleutil.utils.ImageUtils.loadHead(
+ signInData.base_image,
+ mBinding.day4.ivSign
+ )
+ }
+ } else if (signInData.day == 5) {
+ mBinding.day5.tvDay.text = signInData.day.toString()
+
+ mBinding.day5.tvSiginPrice.text = signInData.gift_name + "*" + signInData.num
+ if (signInData.sign_in_status == 1) {
+ mBinding.day5.ivCollected.visibility = View.VISIBLE
+ mBinding.day5.root.setBackgroundResource(R.drawable.select_item_click)
+ ImageLoader.loadImage(
+ context,
+ mBinding.day5.ivSign,
+ signInData.base_image,
+ 0.4f
+ )
+ } else {
+ mBinding.day5.ivCollected.visibility = View.GONE
+ com.xscm.moduleutil.utils.ImageUtils.loadHead(
+ signInData.base_image,
+ mBinding.day5.ivSign
+ )
+ }
+ } else if (signInData.day == 6) {
+ mBinding.day6.tvDay.text = signInData.day.toString()
+
+ mBinding.day6.tvSiginPrice.text = signInData.gift_name + "*" + signInData.num
+ if (signInData.sign_in_status == 1) {
+ mBinding.day6.ivCollected.visibility = View.VISIBLE
+ mBinding.day6.root.setBackgroundResource(R.drawable.select_item_click)
+ ImageLoader.loadImage(
+ context,
+ mBinding.day6.ivSign,
+ signInData.base_image,
+ 0.4f
+ )
+ } else {
+ mBinding.day6.ivCollected.visibility = View.GONE
+ com.xscm.moduleutil.utils.ImageUtils.loadHead(
+ signInData.base_image,
+ mBinding.day6.ivSign
+ )
+ }
+ } else if (signInData.day == 7) {
+ mBinding.day7.tvDay.text = signInData.day.toString()
+
+ mBinding.day7.tvSiginPrice.text = signInData.gift_name + "*" + signInData.num
+ if (signInData.sign_in_status == 1) {
+ mBinding.day7.ivCollected.visibility = View.VISIBLE
+ mBinding.day7.root.setBackgroundResource(R.drawable.select_item_click)
+ ImageLoader.loadImage(
+ context,
+ mBinding.day7.ivSign,
+ signInData.base_image,
+ 0.4f
+ )
+ } else {
+ mBinding.day7.ivCollected.visibility = View.GONE
+ com.xscm.moduleutil.utils.ImageUtils.loadHead(
+ signInData.base_image,
+ mBinding.day7.ivSign
+ )
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/MainModule/src/main/java/com/xscm/modulemain/dialog/SignInSuccessDialog.kt b/MainModule/src/main/java/com/xscm/modulemain/dialog/SignInSuccessDialog.kt
new file mode 100644
index 00000000..956dbec0
--- /dev/null
+++ b/MainModule/src/main/java/com/xscm/modulemain/dialog/SignInSuccessDialog.kt
@@ -0,0 +1,57 @@
+package com.xscm.modulemain.dialog
+
+import android.content.Context
+import android.view.Gravity
+import android.view.ViewGroup
+import com.blankj.utilcode.util.ScreenUtils
+import com.xscm.modulemain.R
+import com.xscm.modulemain.databinding.DialogSignSuccesBinding
+import com.xscm.moduleutil.bean.SignInData
+import com.xscm.moduleutil.utils.ImageUtils
+import com.xscm.moduleutil.widget.dialog.BaseDialog
+
+/**
+ * 项目名称:羽声语音
+ * 时间:2025/12/12 9:37
+ * 用途:签到成功后展示页面
+ */
+class SignInSuccessDialog(context: Context) : BaseDialog(context) {
+ private var onCloseCallback: (() -> Unit)? = null
+
+ fun setOnCloseListener(callback: () -> Unit) = apply {
+ onCloseCallback = callback
+ }
+ init {
+ // 设置对话框从底部弹出
+ window?.setGravity(Gravity.CENTER)
+ // 设置对话框的宽度为屏幕宽度
+ window?.setLayout(
+ (ScreenUtils.getScreenWidth() * 315f / 375).toInt(),
+ ViewGroup.LayoutParams.WRAP_CONTENT
+ )
+ // 添加动画效果
+ window?.setWindowAnimations(com.xscm.moduleutil.R.style.DialogAnimationt)
+ setCancelable(false)
+ setCanceledOnTouchOutside(false)
+ }
+
+ override fun getLayoutId(): Int {
+ return R.layout.dialog_sign_succes
+ }
+
+ override fun initView() {
+ mBinding.btnSign.setOnClickListener {
+ onCloseCallback?.invoke()
+ dismiss()
+ }
+ }
+
+ override fun initData() {
+ }
+
+ fun viewData(signInData: SignInData) {
+ ImageUtils.loadHead(signInData.base_image, mBinding.imV)
+ mBinding.tvSignPrice.text ="签到成功 "+ signInData.gift_name+""+signInData.num
+ }
+
+}
\ No newline at end of file
diff --git a/MainModule/src/main/res/layout/day_sgin.xml b/MainModule/src/main/res/layout/day_sgin.xml
new file mode 100644
index 00000000..46447aab
--- /dev/null
+++ b/MainModule/src/main/res/layout/day_sgin.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/MainModule/src/main/res/layout/day_sgin2.xml b/MainModule/src/main/res/layout/day_sgin2.xml
new file mode 100644
index 00000000..971cb9ab
--- /dev/null
+++ b/MainModule/src/main/res/layout/day_sgin2.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/MainModule/src/main/res/layout/dialog_sign.xml b/MainModule/src/main/res/layout/dialog_sign.xml
new file mode 100644
index 00000000..de7ac451
--- /dev/null
+++ b/MainModule/src/main/res/layout/dialog_sign.xml
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MainModule/src/main/res/layout/dialog_sign_succes.xml b/MainModule/src/main/res/layout/dialog_sign_succes.xml
new file mode 100644
index 00000000..cc88e3d4
--- /dev/null
+++ b/MainModule/src/main/res/layout/dialog_sign_succes.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MainModule/src/main/res/mipmap-hdpi/ic_collected.png b/MainModule/src/main/res/mipmap-hdpi/ic_collected.png
new file mode 100644
index 00000000..39557ab9
Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/ic_collected.png differ
diff --git a/MainModule/src/main/res/mipmap-hdpi/shape_dialog_bg.png b/MainModule/src/main/res/mipmap-hdpi/shape_dialog_bg.png
new file mode 100644
index 00000000..9c51a961
Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/shape_dialog_bg.png differ
diff --git a/MainModule/src/main/res/mipmap-xhdpi/ic_collected.png b/MainModule/src/main/res/mipmap-xhdpi/ic_collected.png
new file mode 100644
index 00000000..6d6ba93d
Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/ic_collected.png differ
diff --git a/MainModule/src/main/res/mipmap-xhdpi/shape_dialog_bg.png b/MainModule/src/main/res/mipmap-xhdpi/shape_dialog_bg.png
new file mode 100644
index 00000000..9172bdfe
Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/shape_dialog_bg.png differ
diff --git a/MainModule/src/main/res/mipmap-xxhdpi/ic_collected.png b/MainModule/src/main/res/mipmap-xxhdpi/ic_collected.png
new file mode 100644
index 00000000..e10f9319
Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/ic_collected.png differ
diff --git a/MainModule/src/main/res/mipmap-xxhdpi/shape_dialog_bg.png b/MainModule/src/main/res/mipmap-xxhdpi/shape_dialog_bg.png
new file mode 100644
index 00000000..0450b96a
Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/shape_dialog_bg.png differ