join.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. <template>
  2. <div class="login-wrap type--join">
  3. <!-- header -->
  4. <div class="login--header">
  5. <div class="login--header--l">
  6. <div class="logo">
  7. <!-- prettier-ignore -->
  8. SHOPDELI
  9. </div>
  10. </div>
  11. <div class="login--header--r"></div>
  12. </div>
  13. <!-- login -->
  14. <div class="login-box type--join">
  15. <div class="login-r">
  16. <h2 class="mk--title">{{ titleh }}</h2>
  17. <div class="join--type">
  18. <v-radio-group v-model="form.formValue0" row inline class="custom-radio type2">
  19. <v-radio value="Y" label="인플루언서"></v-radio>
  20. <v-radio value="N" label="벤더"></v-radio>
  21. </v-radio-group>
  22. </div>
  23. <div class="tit-login">
  24. <strong>회원가입</strong>
  25. <span><i>*</i>필수입력 항목</span>
  26. </div>
  27. <div class="login-input-wrap">
  28. <div class="txt-field-box">
  29. <v-text-field
  30. :disabled="useStore.getSnsTempData?.ID ? true : false"
  31. v-model="form.formValue1"
  32. placeholder="아이디를 입력해주세요"
  33. class="custom-input"
  34. ></v-text-field>
  35. </div>
  36. <div class="txt-field-box">
  37. <v-text-field
  38. v-model="form.formValue2"
  39. :type="visible ? 'text' : 'password'"
  40. placeholder="패스워드를 입력해주세요."
  41. class="custom-input"
  42. id="password"
  43. ></v-text-field>
  44. <i
  45. class="ico-eye"
  46. @click.stop="toggleVisibility"
  47. :class="visible ? 'eye-on' : 'eye-off'"
  48. ></i>
  49. <i class="ico"></i>
  50. </div>
  51. <div class="txt-field-box">
  52. <v-text-field
  53. v-model="form.formValue3"
  54. :type="visible ? 'text' : 'password'"
  55. placeholder="패스워드 확인"
  56. class="custom-input"
  57. ></v-text-field>
  58. <i
  59. class="ico-eye"
  60. @click.stop="toggleVisibility"
  61. :class="visible ? 'eye-on' : 'eye-off'"
  62. ></i>
  63. <i class="ico"></i>
  64. </div>
  65. <div class="txt-field-box">
  66. <v-text-field
  67. v-model="form.formValue4"
  68. :maxlength="20"
  69. :counter="20"
  70. :placeholder="'닉네임을 입력해주세요.'"
  71. class="custom-input"
  72. ></v-text-field>
  73. </div>
  74. <div class="txt-field-box">
  75. <v-text-field
  76. v-model="form.formValue5"
  77. :disabled="useStore.getSnsTempData?.NAME ? true : false"
  78. :maxlength="20"
  79. :counter="20"
  80. placeholder="이름을 입력해주세요"
  81. class="custom-input"
  82. ></v-text-field>
  83. </div>
  84. <div class="txt-field-box">
  85. <v-select
  86. v-model="form.formValue6"
  87. :items="form.formValueItems6"
  88. item-title="text"
  89. item-value="value"
  90. class="custom-select"
  91. ></v-select>
  92. </div>
  93. <div class="txt-field-box">
  94. <v-text-field
  95. v-model="form.formValue7"
  96. placeholder="소셜 ID 또는 주소를 입력해주세요."
  97. class="custom-input"
  98. ></v-text-field>
  99. </div>
  100. <div class="txt-field-box phone">
  101. <v-text-field
  102. placeholder=""
  103. class="custom-input"
  104. v-model="form.formValue8"
  105. ></v-text-field>
  106. -
  107. <v-text-field
  108. placeholder="1234"
  109. class="custom-input"
  110. v-model="form.formValue9"
  111. ></v-text-field>
  112. -
  113. <v-text-field
  114. placeholder="5678"
  115. class="custom-input"
  116. v-model="form.formValue10"
  117. ></v-text-field>
  118. </div>
  119. <div class="txt-field-box email">
  120. <v-text-field
  121. v-model="form.formValue12"
  122. :disabled="useStore.getSnsTempData?.EMAIL"
  123. class="custom-input"
  124. placeholder=""
  125. ></v-text-field>
  126. <span v-if="form.formValue11 != 'direct'">@</span>
  127. <v-select
  128. :disabled="useStore.getSnsTempData?.EMAIL ? true : false"
  129. v-model="form.formValue11"
  130. :items="form.formValueItems11"
  131. item-title="text"
  132. item-value="value"
  133. class="custom-select"
  134. ></v-select>
  135. </div>
  136. <div class="txt-field-box">
  137. <v-textarea
  138. v-model="form.formValue13"
  139. placeholder="자기소개를 입력해주세요. 벤더사들이 참고할 수 있도록 작성해주세요."
  140. class="custom-textarea"
  141. rows="3"
  142. ></v-textarea>
  143. </div>
  144. </div>
  145. {{ useStore.getSnsTempData }}
  146. <div class="login-btn-wrap">
  147. <v-btn class="custom-btn btn-blue" @click.stop="joinMember">회원가입</v-btn>
  148. </div>
  149. </div>
  150. </div>
  151. <!-- footer -->
  152. <div class="login-footer">
  153. <div class="login--footer--l">
  154. <p>COPYRIGHT@2025 SHOPDELI INC. ALL RIGHTS RESERVED.</p>
  155. <p>마포구 합정동</p>
  156. </div>
  157. </div>
  158. </div>
  159. </template>
  160. <script setup>
  161. /************************
  162. * import
  163. ************************/
  164. import apiUrl from "@/composables/useApi";
  165. import { useI18n } from "vue-i18n";
  166. /************************
  167. * layout setting
  168. ************************/
  169. definePageMeta({
  170. layout: "loginlayout",
  171. });
  172. /************************
  173. * 전역
  174. ************************/
  175. const titleh = ref("인플루언서");
  176. const useStore = useAuthStore();
  177. //인플루언서 폼
  178. const form = ref({
  179. formValue0: "Y",
  180. formValue1: useStore.getSnsTempData?.ID || "", // 아이디
  181. formValue2: "", // 패스워드
  182. formValue3: "", // 패스워드 확인
  183. formValue4: "", // 닉네임
  184. formValue5: useStore.getSnsTempData?.NAME || "", // 이름
  185. formValue6: "소셜채널 선택", // 소셜 채널
  186. formValueItems6: [
  187. {
  188. text: "유튜브",
  189. value: "youtube",
  190. },
  191. {
  192. text: "인스타",
  193. value: "instagram",
  194. },
  195. {
  196. text: "네이버 블로그",
  197. value: "naverblog",
  198. },
  199. {
  200. text: "네이버 카페",
  201. value: "navercafe",
  202. },
  203. {
  204. text: "스마트스토어",
  205. value: "smartstore",
  206. },
  207. ], // 소셜 채널 아이템
  208. formValue7: "", // 소셜 ID 또는 주소
  209. formValue8: "010", // 휴대폰1
  210. formValue9: "", // 휴대폰2
  211. formValue10: "", // 휴대폰3
  212. formValue11: "email", // 이메일1
  213. formValueItems11: [
  214. {
  215. text: "이메일 선택",
  216. value: "email",
  217. },
  218. {
  219. text: "직접입력",
  220. value: "direct",
  221. },
  222. {
  223. text: "naver.com",
  224. value: "naver",
  225. },
  226. {
  227. text: "gmail.com",
  228. value: "gmail",
  229. },
  230. {
  231. text: "daum.net",
  232. value: "daum",
  233. },
  234. ], // 이메일 아이템
  235. formValue12: "", // 이메일2
  236. formValue13: "", // 자기소개
  237. });
  238. //밴더 폼
  239. const formVendor = ref({
  240. formValue0: "N",
  241. formValue1: "", // 아이디
  242. formValue2: "", // 패스워드
  243. formValue3: "", // 패스워드 확인
  244. formValue4: "", // 닉네임
  245. formValue5: "", // 이름
  246. formValue6: "소셜채널 선택", // 소셜 채널
  247. });
  248. /************************
  249. * 함수
  250. ************************/
  251. const joinMember = () => {
  252. /*
  253. 제출내용 :
  254. 1. 인플루언서
  255. 일반회원 인경우
  256. - 아이디
  257. - 패스워드
  258. - 패스워드 확인
  259. - 닉네임
  260. - 이름
  261. - 소셜 채널
  262. - 소셜 ID 또는 주소
  263. - 휴대폰 번호
  264. - 이메일
  265. - 자기소개
  266. 2. 소셜계정일경우
  267. - 아이디 : 자동입력
  268. - 패스워드 : 비번은 미입력
  269. - 패스워드 확인 : 비번은 미입력
  270. - 닉네임
  271. - 이름 : 자동입력
  272. - 소셜 채널
  273. - 소셜 ID 또는 주소
  274. - 휴대폰 번호
  275. - 이메일 : 자동입력
  276. - 자기소개
  277. */
  278. // 여기에 폼 제출 로직을 추가하세요.
  279. let _req = {
  280. ID: form.value.formValue1,
  281. PASSWORD: form.value.formValue2,
  282. NAME: form.value.formValue5,
  283. NICK_NAME: form.value.formValue4 || "", //닉네임 없으면 빈문자
  284. PHONE: `${form.value.formValue8}-${form.value.formValue9}-${form.value.formValue10}`,
  285. EMAIL: form.value.formValue12,
  286. SNS_TYPE: form.value.formValue6,
  287. SNS_LINK_ID: form.value.formValue7,
  288. ADD_INFO1: form.value.formValue13,
  289. GOOGLE_REFRESH_TOKEN: useStore.getSnsTempData?.GOOGLE_REFRESH_TOKEN || "",
  290. TYPE: useStore.getSnsTempData ? "1" : "0", // SNS 가입일경우 1, 일반회원 가입일경우 0
  291. };
  292. useAxios()
  293. .post("/auth/joinmember", _req)
  294. .then((res) => {
  295. if (_req.TYPE === "1") {
  296. // SNS 가입일 경우
  297. useStore.setTempData("");
  298. }
  299. useUtil.setPageMove("/");
  300. })
  301. .catch((error) => {
  302. if (error.response) {
  303. console.log("status:", error.response.status, "data:", error.response.data);
  304. // 안전하게 errCode, message 접근
  305. const errData = error.response.data || {};
  306. const errCode = errData.errCode || errData.errorCode || errData.code || "";
  307. const errMsg = errData.message || "알 수 없는 오류가 발생했습니다.";
  308. console.log("errCode:", errCode, "message:", errMsg);
  309. } else {
  310. console.log("error:", error.message, error.code);
  311. }
  312. if (error.response?.status) {
  313. fnLoginSet(error.response.data.messages.message);
  314. }
  315. $log.debug("[join][fnIdPwCheck][error]");
  316. })
  317. .finally(() => {
  318. $log.debug("[join][fnIdPwCheck][finished]");
  319. });
  320. };
  321. /************************
  322. * 마운트
  323. ************************/
  324. onMounted(() => {
  325. if (useStore.getSnsTempData?.EMAIL) {
  326. form.value.formValue12 = useStore.getSnsTempData.EMAIL;
  327. form.value.formValue11 = "direct"; // 이메일 직접입력으로 설정
  328. }
  329. });
  330. watch(
  331. () => form.value.formValue0,
  332. (newValue) => {
  333. if (newValue === "Y") {
  334. titleh.value = "인플루언서";
  335. } else {
  336. titleh.value = "벤더";
  337. }
  338. }
  339. );
  340. </script>