Demand.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. <template>
  2. <div class="customer-info">
  3. <div class="info-title">
  4. {{$t('report.detail.subscribe')}}
  5. <div></div>
  6. </div>
  7. <n-form require-mark-placement="left" label-align="left" ref="formRef" :model="formData" :rules="rules">
  8. <!-- <n-form-item v-show="rowType === '1' && language === 'zh-CN'" > -->
  9. <div class="info-tips" v-if="rowType === '1' && language === 'zh-CN'">
  10. 注明: 此报告为付费报告,客户可在购买前免费索取样本,样本中不包含关键数据点,仅供客户具体了解报告详细框架和细节。
  11. </div>
  12. <!-- </n-form-item> -->
  13. <n-form-item label="版本" label-placement="left" v-if="rowType === '1' && language === 'zh-CN'" path="version">
  14. <!-- <n-input :defaultValue="rowRegion === '0'?'中国':'全球与中国'" readonly/> -->
  15. <n-radio-group bame="version" v-model:value="formData.version" :style="{'width':'100%'}">
  16. <div class="customer-info-china">
  17. <n-radio value="0">中国</n-radio>
  18. <label>中国版本主要关注中国本土市场</label>
  19. </div>
  20. <div class="customer-info-global">
  21. <n-radio value="1">全球与中国</n-radio>
  22. <label class="global-title">全球及中国版本主要关注全球市场</label>
  23. </div>
  24. </n-radio-group>
  25. </n-form-item>
  26. <n-form-item :label="t('report.demand.companyName')+':'" label-placement="left" path="companyName">
  27. <n-input :placeholder="t('report.demand.companyNameTip')" v-model:value="formData.companyName" />
  28. </n-form-item>
  29. <n-form-item :label="t('report.demand.address')+':'" label-placement="left" path="addr">
  30. <n-input :placeholder="t('report.demand.addressTip')" v-model:value="formData.addr" />
  31. </n-form-item>
  32. <n-form-item :label="t('report.demand.email')+':'" label-placement="left" path="email">
  33. <n-input :placeholder="t('report.demand.emailTip')" v-model:value="formData.email" />
  34. </n-form-item>
  35. <n-form-item :label="t('report.demand.phone')+':'" label-placement="left" path="contact" :show-require-mark="language === 'zh-CN'">
  36. <n-input :placeholder="t('report.demand.phoneTip')" v-model:value="formData.contact" />
  37. </n-form-item>
  38. <n-form-item :label="t('report.demand.person')+':'" label-placement="left" path="name">
  39. <n-input :placeholder="t('report.demand.personTip')" v-model:value="formData.name" />
  40. </n-form-item>
  41. <n-form-item :label="t('report.demand.desc')+':'" label-placement="left" path="demand">
  42. <n-input :placeholder="t('report.demand.descTip')" v-model:value="formData.demand" />
  43. </n-form-item>
  44. <div class="form-item-btn">
  45. <n-button class="blue" @click="handleClose">{{t('report.demand.cancel')}}</n-button>
  46. <n-button class="green" type="primary" @click="handleSubmit">{{t('report.demand.submit')}}</n-button>
  47. </div>
  48. </n-form>
  49. </div>
  50. </template>
  51. <script setup>
  52. //import { useLocaleStoreWithOut } from '@/store';
  53. import {
  54. // NForm,
  55. // NFormItem,
  56. // NInput,
  57. // NButton,
  58. // FormRules,
  59. createDiscreteApi,
  60. // NRadio,
  61. // NRadioGroup,
  62. } from "naive-ui";
  63. import { ref, reactive, onMounted } from "vue";
  64. import { useI18n } from "#imports";
  65. import { useUserStore } from "@/store/user";
  66. const userStore = useUserStore();
  67. const language = ref();
  68. onMounted(() => (language.value = userStore.getLang));
  69. const { t } = useI18n();
  70. const emit = defineEmits(["closeDialog"]);
  71. const prop = defineProps({
  72. rowId: {
  73. type: String,
  74. default: "",
  75. },
  76. rowPrice: {
  77. type: String,
  78. default: null,
  79. },
  80. rowType: {
  81. type: String,
  82. default: null,
  83. },
  84. rowRegion: {
  85. type: String,
  86. default: null,
  87. },
  88. });
  89. const message = createDiscreteApi(["message"]);
  90. const formRef = ref();
  91. const formData = reactive({
  92. name: "", // 姓名
  93. contact: "", // 联系方式
  94. email: "", // 邮箱
  95. companyName: "", // 名称
  96. demand: "", // 需求
  97. reportId: "", // 报告id
  98. reportPrice: "", // 报告单价
  99. addr: "", // 联系地址
  100. type: "", //类型,1.样本,2.定制
  101. version: "", //
  102. });
  103. const rules = {
  104. version: [
  105. {
  106. required: true,
  107. trigger: ["input", "blur"],
  108. validator (rule, value) {
  109. if (!value) {
  110. return new Error("请选择版本");
  111. }
  112. return true;
  113. },
  114. },
  115. ],
  116. companyName: [
  117. {
  118. required: true,
  119. trigger: ["input", "blur"],
  120. validator (rule, value) {
  121. if (!value) {
  122. return new Error(t("report.demand.companyNameTip"));
  123. }
  124. return true;
  125. },
  126. },
  127. ],
  128. // addr: [{
  129. // required: true,
  130. // trigger: ['input','blur'],
  131. // validator(rule: FormItemRule, value: string){
  132. // if(!value){
  133. // return new Error(t('report.demand.addressTip'));
  134. // }
  135. // return true;
  136. // }
  137. // }],
  138. email: [
  139. {
  140. required: true,
  141. trigger: ["blur"],
  142. validator (rule, value) {
  143. if (!value) {
  144. return new Error(t("report.demand.emailTip"));
  145. } else if (!isEmail(value)) {
  146. return new Error(t("report.demand.emailFormat"));
  147. }
  148. return true;
  149. },
  150. },
  151. ],
  152. contact: [
  153. {
  154. required: true,
  155. trigger: ["blur"],
  156. validator (rule, value) {
  157. if (!value && language.value == "zh-CN") {
  158. return new Error(t("report.demand.phoneTip"));
  159. } else if (!isPhoneNumber(value) && language.value === "zh-CN") {
  160. return new Error(t("report.demand.phoneFormat"));
  161. }
  162. return true;
  163. },
  164. },
  165. ],
  166. name: [
  167. {
  168. required: true,
  169. trigger: ["blur", "input"],
  170. validator (rule, value) {
  171. if (!value) {
  172. return new Error(t("report.demand.personTip"));
  173. }
  174. return true;
  175. },
  176. },
  177. ],
  178. demand: [
  179. {
  180. required: true,
  181. trigger: ["input", "blur"],
  182. validator (rule, value) {
  183. if (!value) {
  184. return new Error(t("report.demand.descTip"));
  185. }
  186. return true;
  187. },
  188. },
  189. ],
  190. };
  191. // const rules = {
  192. // companyName: {
  193. // required: true,
  194. // message: '请输入公司名称',
  195. // trigger: ['input','blur']
  196. // }
  197. // }
  198. // 提交
  199. function handleSubmit () {
  200. formRef.value?.validate(async (errors) => {
  201. if (!errors) {
  202. formData.reportId = prop.rowId;
  203. formData.reportPrice = prop.rowPrice;
  204. formData.type = prop.rowType;
  205. await customerInfoSave(formData);
  206. emit("closeDialog");
  207. message.message.success(t("report.demand.success"));
  208. }
  209. });
  210. }
  211. // 关闭
  212. function handleClose () {
  213. emit("closeDialog");
  214. }
  215. </script>
  216. <style lang="scss" scoped>
  217. .customer-info {
  218. padding: 20px 58px;
  219. background: #ffffff;
  220. border-radius: 20px;
  221. .info-title {
  222. font-size: 38px;
  223. font-family: Arial, Arial-Bold;
  224. font-weight: 700;
  225. text-align: center;
  226. color: #1a1a1a;
  227. > div {
  228. width: 71px;
  229. height: 6px;
  230. background: linear-gradient(90deg, #719d59 2%, #479f82 98%);
  231. border-radius: 3px;
  232. margin: auto;
  233. }
  234. }
  235. .info-tips {
  236. padding-bottom: 20px;
  237. color: #f00;
  238. }
  239. .customer-info-china,
  240. .customer-info-global {
  241. display: flex;
  242. justify-content: space-between;
  243. }
  244. .customer-info-china {
  245. padding-bottom: 20px;
  246. }
  247. }
  248. .form-item-btn {
  249. display: flex;
  250. justify-content: center;
  251. .n-button {
  252. width: 144px;
  253. height: 48px;
  254. border-radius: 8px;
  255. font-size: 14px;
  256. font-family: Arial, Arial-Regular;
  257. text-align: center;
  258. color: #ffffff;
  259. line-height: 48px;
  260. margin-right: 14px;
  261. cursor: pointer;
  262. &:last-child {
  263. margin-right: 0;
  264. }
  265. }
  266. .blue {
  267. color: #666666;
  268. }
  269. // .green {
  270. // background: #84a86c;
  271. // }
  272. }
  273. :deep(.n-form-item-label) {
  274. color: #666666;
  275. font-family: Microsoft YaHei, Microsoft YaHei-Regular;
  276. line-height: var(--size-34);
  277. border-bottom: 1px solid #e6e6e6;
  278. padding: 10px 10px 20px 0;
  279. }
  280. :deep(.n-input-wrapper) {
  281. font-size: var(--size-14);
  282. font-family: Microsoft YaHei, Microsoft YaHei-Regular;
  283. border-bottom: var(--size-1) solid #e6e6e6;
  284. line-height: var(--size-34);
  285. padding: 10px 0 20px;
  286. }
  287. :deep(.n-form-item-blank--error .n-input) {
  288. --n-border-error: var(--size-1) solid transparent !important;
  289. --n-border-focus-error: var(--size-1) solid transparent !important;
  290. --n-border-hover-error: var(--size-1) solid transparent !important;
  291. --n-box-shadow-focus-error: var(--size-1) solid transparent !important;
  292. }
  293. .area {
  294. width: 100%;
  295. :deep(.n-form-item-label),
  296. :deep(.n-input-wrapper) {
  297. border-bottom: none;
  298. }
  299. :deep(.n-input--textarea) {
  300. background: #fafafa;
  301. border: var(--size-1) solid #e6e6e6;
  302. border-radius: var(--size-10);
  303. padding: 0 var(--size-5);
  304. }
  305. :deep(.n-input.n-input--textarea.n-input--resizable .n-input-wrapper) {
  306. min-height: var(--size-260);
  307. }
  308. }
  309. </style>